Saya memiliki byte[]
array yang diambil dari file yang kebetulan saya kenal mengandung UTF-8 .
Dalam beberapa kode debug, saya perlu mengubahnya menjadi string. Apakah ada satu liner yang akan melakukan ini?
Di bawah selimut itu harus hanya alokasi dan memo , jadi bahkan jika itu tidak dilaksanakan, itu harus mungkin.
Jawaban:
sumber
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Setidaknya ada empat cara berbeda melakukan konversi ini.
Encoding's GetString
, tetapi Anda tidak akan bisa mendapatkan kembali byte asli jika byte tersebut memiliki karakter non-ASCII.
BitConverter.ToString
Outputnya adalah string yang dibatasi "-", tetapi tidak ada metode .NET built-in untuk mengubah string kembali ke byte array.
Convert.ToBase64String
Anda dapat dengan mudah mengkonversi string output kembali ke byte array dengan menggunakan
Convert.FromBase64String
.Catatan: String output dapat berisi '+', '/' dan '='. Jika Anda ingin menggunakan string dalam URL, Anda harus menyandikannya secara eksplisit.
HttpServerUtility.UrlTokenEncode
Anda dapat dengan mudah mengkonversi string output kembali ke byte array dengan menggunakan
HttpServerUtility.UrlTokenDecode
. String output sudah ramah URL! Kelemahannya adalah perluSystem.Web
perakitan jika proyek Anda bukan proyek web.Contoh lengkap:
sumber
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Solusi umum untuk mengkonversi dari array byte ke string ketika Anda tidak tahu pengkodeannya:
sumber
Definisi:
Menggunakan:
sumber
Konversi a
byte[]
ke yangstring
tampak sederhana tetapi segala jenis pengkodean cenderung mengacaukan string keluaran. Fungsi kecil ini hanya berfungsi tanpa hasil yang tidak terduga:sumber
Menggunakan
(byte)b.ToString("x2")
, Outputb4b5dfe475e58b67
sumber
Ada juga kelas UnicodeEncoding, cukup sederhana dalam penggunaan:
sumber
UnicodeEncoding
adalah nama kelas terburuk yang pernah ada; unicode sama sekali bukan encoding. Kelas itu sebenarnya adalah UTF-16. Versi little-endian, kurasa.Kalau tidak:
sumber
Linq one-liner untuk mengonversi byte array yang
byteArrFilename
dibaca dari file ke string ascii C-style nol murni akan seperti ini: Berguna untuk membaca hal-hal seperti tabel indeks file dalam format arsip lama.Saya menggunakan
'?'
sebagai default char untuk apa pun yang bukan ascii murni di sini, tapi itu bisa diubah, tentu saja. Jika Anda ingin memastikan Anda bisa mendeteksinya, gunakan'\0'
saja, karenaTakeWhile
pada awalnya memastikan bahwa string yang dibangun dengan cara ini tidak mungkin mengandung'\0'
nilai dari sumber input.sumber
BitConverter
kelas dapat digunakan untuk mengonversi abyte[]
menjadistring
.Dokumentasi
BitConverter
kelas dapat diperoleh di MSDNsumber
Setahu saya tidak ada jawaban yang diberikan menjamin perilaku yang benar dengan nol penghentian. Sampai seseorang menunjukkan saya berbeda saya menulis kelas statis saya sendiri untuk menangani ini dengan metode berikut:
Alasannya
startIndex
adalah dalam contoh yang saya kerjakan secara khusus saya perlu menguraikanbyte[]
sebagai array string diakhiri null. Ini dapat diabaikan dengan aman dalam kasus sederhanasumber
byteArr.TakeWhile(x => x != 0)
adalah cara cepat dan mudah untuk menyelesaikan masalah terminasi nol.hier adalah hasil di mana Anda tidak perlu repot dengan pengkodean. Saya menggunakannya di kelas jaringan saya dan mengirim objek biner sebagai string dengannya.
sumber
Selain jawaban yang dipilih, jika Anda menggunakan .NET35 atau .NET35 CE, Anda harus menentukan indeks byte pertama yang akan di-decode, dan jumlah byte yang di-decode:
sumber
Coba aplikasi konsol ini:
sumber
Saya melihat beberapa jawaban di posting ini dan dimungkinkan untuk dianggap pengetahuan dasar yang lengkap, karena memiliki beberapa pendekatan dalam Pemrograman C # untuk menyelesaikan masalah yang sama. Hanya satu hal yang perlu dipertimbangkan adalah tentang perbedaan antara Pure UTF-8 dan UTF-8 dengan BOM .
Pada minggu lalu, di pekerjaan saya, saya perlu mengembangkan satu fungsionalitas yang menghasilkan file CSV dengan BOM dan CSV lainnya dengan UTF-8 murni (tanpa BOM), setiap jenis file CSV Encoding akan dikonsumsi oleh berbagai API non-standar, yang API membaca UTF-8 dengan BOM dan API lainnya membaca tanpa BOM. Saya perlu meneliti referensi tentang konsep ini, membaca " Apa perbedaan antara UTF-8 dan UTF-8 tanpa BOM? " Diskusi Stack Overflow dan tautan Wikipedia ini " Tanda urutan Byte " untuk membangun pendekatan saya.
Akhirnya, Pemrograman C # saya untuk kedua jenis pengkodean UTF-8 (dengan BOM dan murni) harus serupa seperti contoh di bawah ini:
sumber