Pregunta Cómo convertir bytes UTF-8 [] a string?


tengo un byte[] matriz que se carga desde un archivo que sé que contiene UTF-8. En algún código de depuración, necesito convertirlo a una cadena. ¿Hay un trazador de líneas que hará esto?

Bajo las sábanas, debería ser solo una asignación y una Memcopy, por lo que incluso si no se implementa, debería ser posible.


740
2018-06-16 18:47


origen


Respuestas:


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

1199
2018-06-16 18:49



Hay al menos cuatro formas diferentes de hacer esta conversión.

  1. Codificación GetString
    , pero no podrá recuperar los bytes originales si esos bytes tienen caracteres que no sean ASCII.

  2. BitConverter.ToString
     El resultado es una cadena delimitada por "-", pero no hay un método incorporado de .NET para convertir la cadena nuevamente en matriz de bytes.

  3. Convert.ToBase64String
     Puede convertir fácilmente la cadena de salida a matriz de bytes utilizando Convert.FromBase64String.
     Nota: La cadena de salida podría contener '+', '/' y '='. Si desea utilizar la cadena en una URL, debe codificarla explícitamente.

  4. HttpServerUtility.UrlTokenEncode
    Puede convertir fácilmente la cadena de salida a matriz de bytes utilizando HttpServerUtility.UrlTokenDecode. ¡La cadena de salida ya es amigable para las URL! La desventaja es que necesita System.Web ensamblaje si su proyecto no es un proyecto web.

Un ejemplo completo:

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



Una solución general para convertir de matriz de bytes a cadena cuando no se conoce la codificación:

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



Definición:

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

Utilizando:

string result = input.ConvertByteToString();

11
2017-10-16 01:04



Convirtiendo un byte[] a un string parece simple, pero cualquier tipo de codificación puede estropear la cadena de salida. Esta pequeña función solo funciona sin ningún resultado inesperado:

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



Utilizando (byte)b.ToString("x2"), Salidas 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



También hay clase UnicodeEncoding, bastante simple de usar:

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



Alternativamente:

 var byteStr = Convert.ToBase64String(bytes);

1
2017-09-15 05:55