Frage Wie konvertiert man UTF-8 byte [] in einen String?


Ich habe ein byte[] Array, das aus einer Datei geladen wird, die ich kenne, enthält UTF-8. In einigen Debugging-Code muss ich es in eine Zeichenfolge konvertieren. Gibt es einen Liner, der das macht?

Unter den Deckeln sollte es nur eine Zuweisung und ein Memkopiealso sollte es möglich sein, auch wenn es nicht implementiert ist.


740
2018-06-16 18:47


Ursprung


Antworten:


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

1199
2018-06-16 18:49



Es gibt mindestens vier verschiedene Möglichkeiten, diese Konvertierung durchzuführen.

  1. Encoding's GetString
    , aber Sie können die ursprünglichen Bytes nicht zurückerhalten, wenn diese Bytes Nicht-ASCII-Zeichen haben.

  2. BitConverter.ToString
     Die Ausgabe ist eine durch "-" getrennte Zeichenfolge, aber es gibt keine integrierte .NET-Methode, um die Zeichenfolge zurück in Byte-Array zu konvertieren.

  3. Convert.ToBase64String
     Sie können die Ausgabestring einfach in Byte-Array konvertieren, indem Sie verwenden Convert.FromBase64String.
     Hinweis: Die Ausgabezeichenfolge könnte '+', '/' und '=' enthalten. Wenn Sie die Zeichenfolge in einer URL verwenden möchten, müssen Sie sie explizit codieren.

  4. HttpServerUtility.UrlTokenEncode
    Sie können die Ausgabestring einfach in Byte-Array konvertieren, indem Sie verwenden HttpServerUtility.UrlTokenDecode. Der Ausgabe-String ist bereits URL-freundlich! Der Nachteil ist, dass es benötigt wird System.Web Assembly, wenn Ihr Projekt kein Webprojekt ist.

Ein vollständiges Beispiel:

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



Eine allgemeine Lösung zum Konvertieren von Byte-Array in String, wenn Sie die Codierung nicht kennen:

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



Definition:

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

Verwenden:

string result = input.ConvertByteToString();

11
2017-10-16 01:04



Konvertieren eines byte[] zu einem string scheint einfach, aber jede Art von Codierung ist wahrscheinlich die Ausgabe-String zu durcheinander bringen. Diese kleine Funktion funktioniert ohne unerwartete Ergebnisse:

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



Verwenden (byte)b.ToString("x2"), Ausgänge 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



Es gibt auch die Klasse UnicodeEncoding, recht einfach in der Verwendung:

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



Alternative:

 var byteStr = Convert.ToBase64String(bytes);

1
2017-09-15 05:55



Ein Linq One-Liner zum Konvertieren eines Byte-Arrays byteArrFilename Lesen von einer Datei zu einem reinen ascii C-style Null-terminierten String wäre dies: Handy zum Lesen von Dingen wie Datei-Index-Tabellen in alten Archiv-Formaten.

String filename = new String(byteArrFilename.TakeWhile(x => x != 0)
                              .Select(x => x < 128 ? (Char)x : '?').ToArray());

ich benutze '?' als Voreinstellung char für alles nicht rein ascii hier, aber das kann natürlich geändert werden. Wenn Sie sicher sein wollen, dass Sie es erkennen können, verwenden Sie einfach '\0' stattdessen, seit der TakeWhile Am Anfang stellt sicher, dass eine auf diese Weise erstellte Zeichenfolge nicht enthalten kann '\0' Werte aus der Eingabequelle.


1
2017-11-17 08:12