Pertanyaan Bagaimana cara mengubah UTF-8 byte [] ke string?


Saya punya byte[] larik yang dimuat dari file yang kebetulan saya ketahui berisi UTF-8. Dalam beberapa kode debug, saya perlu mengonversinya menjadi string. Apakah ada satu liner yang akan melakukan ini?

Di bawah penutup itu seharusnya hanya sebuah alokasi dan a memcopy, jadi bahkan jika itu tidak dilaksanakan, itu harus mungkin.


740
2018-06-16 18:47


asal


Jawaban:


string result = System.Text.Encoding.UTF8.GetString(byteArray);

1199
2018-06-16 18:49



Setidaknya ada empat cara berbeda dalam melakukan konversi ini.

  1. Encoding's GetString
    , tetapi Anda tidak akan bisa mendapatkan kembali byte asli jika byte tersebut memiliki karakter non-ASCII.

  2. BitConverter.ToString
     Outputnya adalah "-" string terbatas, tetapi tidak ada. NET built-in method untuk mengonversi string kembali ke susunan byte.

  3. Convert.ToBase64String
     Anda dapat dengan mudah mengkonversi string output kembali ke susunan byte dengan menggunakan Convert.FromBase64String.
     Catatan: String output bisa berisi '+', '/' dan '='. Jika Anda ingin menggunakan string dalam URL, Anda harus secara eksplisit menyandikannya.

  4. HttpServerUtility.UrlTokenEncode
    Anda dapat dengan mudah mengkonversi string output kembali ke susunan byte dengan menggunakan HttpServerUtility.UrlTokenDecode. String keluaran sudah ramah URL! Kekurangannya adalah kebutuhannya System.Web perakitan jika proyek Anda bukan proyek web.

Contoh lengkap:

byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters

string s1 = Encoding.UTF8.GetString(bytes); // ���
byte[] decBytes1 = Encoding.UTF8.GetBytes(s1);  // decBytes1.Length == 10 !!
// decBytes1 not same as bytes
// Using UTF-8 or other Encoding object will get similar results

string s2 = BitConverter.ToString(bytes);   // 82-C8-EA-17
String[] tempAry = s2.Split('-');
byte[] decBytes2 = new byte[tempAry.Length];
for (int i = 0; i < tempAry.Length; i++)
    decBytes2[i] = Convert.ToByte(tempAry[i], 16);
// decBytes2 same as bytes

string s3 = Convert.ToBase64String(bytes);  // gsjqFw==
byte[] decByte3 = Convert.FromBase64String(s3);
// decByte3 same as bytes

string s4 = HttpServerUtility.UrlTokenEncode(bytes);    // gsjqFw2
byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
// decBytes4 same as bytes

271
2018-02-28 02:31



Solusi umum untuk mengkonversi dari susunan byte ke string saat Anda tidak mengetahui pengkodean:

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}

20
2017-09-20 08:24



Definisi:

public static string ConvertByteToString(this byte[] source)
{
    return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}

Menggunakan:

string result = input.ConvertByteToString();

11
2017-10-16 01:04



Mengonversi a byte[] ke a string tampaknya sederhana tetapi jenis pengkodean apa pun cenderung mengacaukan output string. Fungsi kecil ini berfungsi tanpa hasil yang tidak terduga:

private string ToString(byte[] bytes)
{
    string response = string.Empty;

    foreach (byte b in bytes)
        response += (Char)b;

    return response;
}

8
2018-04-22 11:48



Menggunakan (byte)b.ToString("x2"), Keluaran b4b5dfe475e58b67

public static class Ext {

    public static string ToHexString(this byte[] hex)
    {
        if (hex == null) return null;
        if (hex.Length == 0) return string.Empty;

        var s = new StringBuilder();
        foreach (byte b in hex) {
            s.Append(b.ToString("x2"));
        }
        return s.ToString();
    }

    public static byte[] ToHexBytes(this string hex)
    {
        if (hex == null) return null;
        if (hex.Length == 0) return new byte[0];

        int l = hex.Length / 2;
        var b = new byte[l];
        for (int i = 0; i < l; ++i) {
            b[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return b;
    }

    public static bool EqualsTo(this byte[] bytes, byte[] bytesToCompare)
    {
        if (bytes == null && bytesToCompare == null) return true; // ?
        if (bytes == null || bytesToCompare == null) return false;
        if (object.ReferenceEquals(bytes, bytesToCompare)) return true;

        if (bytes.Length != bytesToCompare.Length) return false;

        for (int i = 0; i < bytes.Length; ++i) {
            if (bytes[i] != bytesToCompare[i]) return false;
        }
        return true;
    }

}

7
2017-11-22 17:15



Ada juga kelas UnicodeEncoding, cukup sederhana dalam penggunaan:

ByteConverter = new UnicodeEncoding();
string stringDataForEncoding = "My Secret Data!";
byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);

Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));

4
2018-05-18 13:38



Kalau tidak:

 var byteStr = Convert.ToBase64String(bytes);

1
2017-09-15 05:55