Saya mengubah sesuatu dari VB menjadi C #. Mengalami masalah dengan sintaks dari pernyataan ini:
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
Saya kemudian melihat kesalahan berikut:
Argumen 1: tidak dapat mengonversi dari 'objek' ke 'byte []'
Metode overload terbaik untuk 'System.Text.Encoding.GetString (byte [])' memiliki beberapa argumen yang tidak valid
Saya mencoba memperbaiki kode berdasarkan posting ini , tetapi masih belum berhasil
string User = Encoding.UTF8.GetString("user", 0);
Ada saran?
searchResult.Properties["user"][0]
? Coba castingbyte[]
terlebih dahulu(byte[])
di hasil pencarian?Properties["user"][0]
. Jika Anda yakin ini adalah array byte maka Anda dapat melakukan seperti iniprofile.User = System.Text.Encoding.UTF8.GetString((byte[])searchResult.Properties["user"][0]);
Jawaban:
Jika Anda sudah memiliki array byte maka Anda harus tahu jenis pengkodean apa yang digunakan untuk membuatnya menjadi array byte.
Misalnya, jika array byte dibuat seperti ini:
Anda harus mengubahnya kembali menjadi string seperti ini:
Jika Anda dapat menemukan kode yang Anda warisi, pengkodean yang digunakan untuk membuat array byte maka Anda harus mengaturnya.
sumber
Pertama-tama, tambahkan
System.Text
namespaceKemudian gunakan kode ini
Berharap untuk memperbaikinya!
sumber
Anda juga dapat menggunakan Metode Ekstensi untuk menambahkan metode ke
string
jenis seperti di bawah ini:Dan gunakan seperti di bawah ini:
sumber
ToASCIIByteArray
. Saya benci ketika saya menemukan beberapa perpustakaan yang saya gunakan menggunakan ASCII dan saya menganggap itu menggunakan UTF-8 atau sesuatu yang lebih modern.sumber
sumber
Mengapa Pengkodean. Kesalahan tidak boleh digunakan ...
@ Randall menggunakan jawaban
Encoding.Default
, namun Microsoft memunculkan peringatan terhadapnya :Untuk memeriksa apa pengkodean default, gunakan
Encoding.Default.WindowsCodePage
(1250 dalam kasus saya - dan sayangnya, tidak ada kelas pengkodean CP1250 yang telah ditentukan, tetapi objek dapat diambil sebagaiEncoding.GetEncoding(1250)
).Encoding.ASCII
adalah 7bit, jadi tidak berfungsi, dalam kasus saya:... dan mengapa pengkodean UTF-8 harus digunakan sebagai gantinya ...
Pengkodean default menyesatkan: .NET menggunakan UTF-8 di mana-mana sebagai standar nyata (pengodean 8-bit menjadi usang pada akhir abad ke-20, periksa mis.
Console.OutputEncoding.EncodingName
*) Sehingga setiap konstanta yang Anda tetapkan dalam kode tersebut adalah UTF-8 yang disandikan secara default - jadi ini harus digunakan kecuali sumber data dalam pengkodean yang berbeda.* Ini adalah UTF-8 dalam kasus saya yang merupakan kebohongan langsung:
chcp
dari windows console (cmd) mengembalikan 852 - dan ini tidak boleh diubah, karena perintah sistem yang terlokalisasi (seperti ping) memiliki codepage ini hardcodedMengikuti rekomendasi Microsoft:
Encoding.UTF8
direkomendasikan oleh orang lain adalah contoh pengkodean uf UTF-8 dan dapat juga digunakan secara langsung atau sebagai... tapi itu tidak selalu digunakan
Pengkodean untuk byte array seharusnya "hanya berfungsi" di Unicode di negara-negara Barat, tetapi segera setelah Anda memindahkan program Anda ke beberapa daerah yang kurang didukung (seperti di sini di Eropa Timur), itu adalah kekacauan yang nyata: di Republik Ceko Windows default menggunakan (pada tahun 2020!) MS non-standar 852 (alias Latin-2) untuk konsol, 1250 sebagai Windows OEM, UTF-8 (65001) sebagai .NET (dan lain-lain) default baru dan kita harus ingat bahwa beberapa EU 8bit barat data masih dalam 1252, sedangkan standar barat 8bit lama untuk Eropa Timur adalah ISO-8859-2 (alias Latin-2, tapi BUKAN sama Latin-2 seperti 852). Menggunakan ASCII berarti teks yang penuh dengan tahu dan '?' sini. Jadi hingga paruh abad ke-21, harap tetapkan UTF-8 secara eksplisit .
sumber
Membangun jawaban Ali , saya akan merekomendasikan metode ekstensi yang memungkinkan Anda untuk secara opsional meneruskan pengkodean yang ingin Anda gunakan:
Dan gunakan seperti di bawah ini:
sumber
Encoding encoding = Encoding.Default
hasil dalam kesalahan waktu kompilasi:CS1736 Default parameter value for 'encoding' must be a compile-time constant
Pendekatan berikut hanya akan berfungsi jika karakternya 1 byte. (Unicode default tidak akan berfungsi karena 2 byte)
Menjaga agar tetap sederhana
sumber
char
danstring
definisi UTF-16.string
dan oleh karena itu UTF-16. UTF-16 bukan default; tidak ada pilihan tentang itu. Anda kemudian dibagi menjadichar[]
, unit kode UTF-16. Anda kemudian memanggil Convert.ToByte (Char) , yang kebetulan mengubah U + 0000 menjadi U + 00FF ke ISO-8859-1 , dan mengubah titik-titik kode lain.char
menjadi 16 bit danConvert.ToByte()
membuang setengahnya.Gunakan ini
sumber
Penyempurnaan hasil edit JustinStolle (penggunaan BlockCopy dari Eran Yogev).
Solusi yang diusulkan memang lebih cepat daripada menggunakan Encoding. Masalahnya adalah itu tidak bekerja untuk encoding byte array dengan panjang yang tidak rata. Seperti yang diberikan, itu menimbulkan pengecualian di luar batas. Menambah panjang sebesar 1 meninggalkan trailing byte saat decoding dari string.
Bagi saya, kebutuhan datang ketika saya ingin menyandikan dari
DataTable
keJSON
. Saya sedang mencari cara untuk menyandikan bidang biner menjadi string dan mendekode dari string kembali kebyte[]
.Karena itu saya membuat dua kelas - satu yang membungkus solusi di atas (ketika pengkodean dari string tidak apa-apa, karena panjangnya selalu genap), dan yang lain yang menangani
byte[]
pengodean.Saya memecahkan masalah panjang yang tidak rata dengan menambahkan satu karakter yang memberitahu saya apakah panjang asli dari array biner itu ganjil ('1') atau genap ('0')
Sebagai berikut:
sumber
Pertanyaan ini telah dijawab berkali-kali, tetapi dengan C # 7.2 dan pengenalan tipe Span, ada cara yang lebih cepat untuk melakukan ini dalam kode yang tidak aman:
Perlu diingat bahwa byte mewakili string UTF-16 yang dikodekan (disebut "Unicode" di C # land).
Beberapa pembandingan cepat menunjukkan bahwa metode di atas kira-kira 5x lebih cepat daripada Encoding.Unicode.GetBytes mereka (...) / GetString (...) implementasi untuk string berukuran sedang (30-50 karakter), dan bahkan lebih cepat untuk string yang lebih besar. Metode ini juga tampaknya lebih cepat daripada menggunakan pointer dengan Marshal.Copy (..) atau Buffer.MemoryCopy (...).
sumber
Jika hasil dari, 'searchResult.Properties ["user"] [0]', adalah sebuah string:
Poin kuncinya adalah bahwa mengonversi string ke byte [] dapat dilakukan menggunakan LINQ:
Dan kebalikannya:
sumber
Adakah yang melihat alasan mengapa tidak melakukan ini?
sumber
Convert.ToByte(char)
tidak bekerja seperti yang Anda pikirkan. Karakter'2'
dikonversi ke byte2
, bukan byte yang mewakili karakter'2'
. Gunakanmystring.Select(x => (byte)x).ToArray()
sebagai gantinya.Ini yang bekerja untuk saya
sumber
Anda dapat menggunakan MemoryMarshal API untuk melakukan konversi yang sangat cepat dan efisien.
String
secara implisit akan dilemparkan keReadOnlySpan<byte>
, sebagaiMemoryMarshal.Cast
menerima baikSpan<byte>
atauReadOnlySpan<byte>
sebagai parameter input.Patokan berikut menunjukkan perbedaan:
sumber
Ini bekerja untuk saya, setelah itu saya bisa mengonversi gambar saya di bidang bytea di database saya.
sumber