Question Comment convertir un octet UTF-8 [] en chaîne?


j'ai un byte[] tableau qui est chargé à partir d'un fichier que je possède connu contient UTF-8. Dans un code de débogage, j'ai besoin de le convertir en une chaîne. Y a-t-il un seul paquebot qui va le faire?

Sous les couvertures, il devrait être juste une allocation et un memcopy, même si ce n'est pas mis en œuvre, cela devrait être possible.


740
2018-06-16 18:47


origine


Réponses:


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

1199
2018-06-16 18:49



Il y a au moins quatre manières différentes de faire cette conversion.

  1. Encoding's GetString
    , mais vous ne pourrez pas récupérer les octets d'origine si ces octets ont des caractères non-ASCII.

  2. BitConverter.ToString
     La sortie est une chaîne délimitée par "-", mais il n'y a pas de méthode intégrée .NET pour convertir la chaîne en tableau d'octets.

  3. Convert.ToBase64String
     Vous pouvez facilement convertir la chaîne de sortie en tableau d'octets en utilisant Convert.FromBase64String.
     Remarque: La chaîne de sortie peut contenir '+', '/' et '='. Si vous souhaitez utiliser la chaîne dans une URL, vous devez l'encoder explicitement.

  4. HttpServerUtility.UrlTokenEncode
    Vous pouvez facilement convertir la chaîne de sortie en tableau d'octets en utilisant HttpServerUtility.UrlTokenDecode. La chaîne de sortie est déjà compatible avec les URL! L'inconvénient est-il besoin System.Web assembly si votre projet n'est pas un projet web.

Un exemple complet:

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



Une solution générale pour convertir un tableau d'octets en chaîne lorsque vous ne connaissez pas l'encodage:

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



Définition:

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

En utilisant:

string result = input.ConvertByteToString();

11
2017-10-16 01:04



Convertir un byte[] à un string semble simple mais tout type d'encodage est susceptible de gâcher la chaîne de sortie. Cette petite fonction fonctionne simplement sans résultats inattendus:

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



En utilisant (byte)b.ToString("x2"), Les sorties 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



Il y a aussi la classe UnicodeEncoding, assez simple d'utilisation:

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