it-swarm.com.de

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

Ich habe ein byte[]-Array, das aus einer Datei geladen wird, die mir bekannt ist, enthält UTF-8 . In einem Debugging-Code muss ich ihn in eine Zeichenfolge konvertieren. Gibt es einen Liner, der dies tun wird? 

Unter den Cover sollte es nur eine Zuteilung und eine memcopy sein, also sollte es möglich sein, auch wenn es nicht implementiert ist.

810
BCS
string result = System.Text.Encoding.UTF8.GetString(byteArray);
1299
Zanoni

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

  1. GetString von Encoding
    , aber Sie können die ursprünglichen Bytes nicht zurückbekommen, wenn diese Bytes Nicht-ASCII-Zeichen enthalten.

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

  3. Convert.ToBase64String
    Sie können die Ausgabezeichenfolge leicht mit Hilfe von Convert.FromBase64String in ein Byte-Array konvertieren.
    Hinweis: Die Ausgabezeichenfolge kann '+', '/' und '=' enthalten. Wenn Sie die Zeichenfolge in einer URL verwenden möchten, müssen Sie sie explizit kodieren.

  4. HttpServerUtility.UrlTokenEncode
    Sie können die Ausgabezeichenfolge leicht mit Hilfe von HttpServerUtility.UrlTokenDecode in ein Byte-Array konvertieren. Die Ausgabezeichenfolge ist bereits URL-freundlich! Der Nachteil ist, dass es System.Web Assembly benötigt, 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
292
detale

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

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

Definition:

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

Verwenden von:

string result = input.ConvertByteToString();
12

Das Konvertieren eines byte[] in eine string scheint einfach zu sein, aber jede Art von Kodierung führt wahrscheinlich zu einer Störung der Ausgabezeichenfolge. Diese kleine Funktion funktioniert nur ohne unerwartete Ergebnisse: 

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

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

    return response;
}
9
AndrewJE

Mit (byte)b.ToString("x2"), Ausgaben 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;
    }

}
8
metadings

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

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

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

Alternative:

 var byteStr = Convert.ToBase64String(bytes);
2
Fehr

Meines Wissens garantiert keine der angegebenen Antworten ein korrektes Verhalten mit Nullkündigung. Bis mir jemand etwas anderes zeigt, habe ich meine eigene statische Klasse mit den folgenden Methoden geschrieben:

// Mimics the functionality of strlen() in c/c++
// Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well
static int StringLength(byte[] buffer, int startIndex = 0)
{
    int strlen = 0;
    while
    (
        (startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds
        && buffer[startIndex + strlen] != 0       // The typical null terimation check
    )
    {
        ++strlen;
    }
    return strlen;
}

// This is messy, but I haven't found a built-in way in c# that guarentees null termination
public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0)
{
    strlen = StringLength(buffer, startIndex);
    byte[] c_str = new byte[strlen];
    Array.Copy(buffer, startIndex, c_str, 0, strlen);
    return Encoding.UTF8.GetString(c_str);
}

Der Grund für die startIndex war in dem Beispiel, an dem ich gerade arbeitete, speziell, dass ich einen byte[] als ein Array mit nullterminierten Zeichenfolgen analysieren musste. Im einfachen Fall kann es gefahrlos ignoriert werden

2
Assimilater

BitConverter-Klasse kann verwendet werden, um einen byte[] in string umzuwandeln.

var convertedString = BitConverter.ToString(byteAttay);

Die Dokumentation der BitConverter-Klasse kann auf MSDN fountet werden.

2
Sagar

Ein Linq-Einzeiler zum Konvertieren eines Byte-Arrays byteArrFilename, das aus einer Datei in einen reinen ASCII-C-Stil mit nullterminierten Zeichenfolgen konvertiert wird, könnte folgendermaßen aussehen: Praktisch für das Lesen von Dateien wie Index-Tabellen in alten Archivformaten.

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

Ich benutze '?' als Standardzeichen für alles, was hier nicht reines ASCII ist, aber das kann natürlich geändert werden. Wenn Sie sichergehen möchten, dass Sie es erkennen können, verwenden Sie stattdessen '\0', da die TakeWhile zu Beginn sicherstellt, dass eine auf diese Weise erstellte Zeichenfolge '\0'-Werte nicht aus der Eingabequelle enthalten kann.

2
Nyerguds

Wenn Sie .NET35 oder .NET35 CE verwenden, müssen Sie zusätzlich zur ausgewählten Antwort den Index des ersten zu decodierenden Bytes und die Anzahl der zu decodierenden Bytes angeben:

string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length);
0
The One

hier ist ein Ergebnis, bei dem Sie sich nicht mit der Kodierung beschäftigen mussten. Ich habe es in meiner Netzwerkklasse verwendet und binäre Objekte als String damit verschicken.

        public static byte[] String2ByteArray(string str)
        {
            char[] chars = str.ToArray();
            byte[] bytes = new byte[chars.Length * 2];

            for (int i = 0; i < chars.Length; i++)
                Array.Copy(BitConverter.GetBytes(chars[i]), 0, bytes, i * 2, 2);

            return bytes;
        }

        public static string ByteArray2String(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / 2];

            for (int i = 0; i < chars.Length; i++)
                chars[i] = BitConverter.ToChar(bytes, i * 2);

            return new string(chars);
        }
0
Marco Pardo

Versuche dies:

string myresult = System.Text.Encoding.UTF8.GetString(byteArray);
0
Bill