Cómo convertir bytes UTF-8 [] a cadena

Resuelto BCS asked hace 15 años • 16 respuestas

Tengo una byte[]matriz que se carga desde un archivo que sé que contiene UTF-8 .

En algún código de depuración, necesito convertirlo en una cadena. ¿Existe alguna frase ingeniosa que haga esto?

Debajo de las sábanas debería haber solo una asignación y una copia de memoria , por lo que incluso si no se implementa, debería ser posible.

BCS avatar Jun 17 '09 01:06 BCS
Aceptado
string result = System.Text.Encoding.UTF8.GetString(byteArray);

o uno de los de sobrecarga si conoces la longitud:

string result = System.Text.Encoding.UTF8.GetString(byteArray, 0, 42);
Zanoni avatar Jun 16 '2009 18:06 Zanoni

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

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

  2. BitConverter.ToString
    La salida es una cadena delimitada por "-", pero no existe ningún método integrado de .NET para convertir la cadena nuevamente en una matriz de bytes.

  3. Convert.ToBase64String
    Puede convertir fácilmente la cadena de salida a una matriz de bytes usando 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 una matriz de bytes usando HttpServerUtility.UrlTokenDecode. ¡La cadena de salida ya es compatible con URL! La desventaja es que necesita System.Webmontaje 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
detale avatar Feb 28 '2014 02:02 detale

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

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}
Nir avatar Sep 20 '2015 08:09 Nir

Definición:

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

Usando:

string result = input.ConvertByteToString();
Erçin Dedeoğlu avatar Oct 16 '2014 01:10 Erçin Dedeoğlu

Vi algunas respuestas en esta publicación y es posible considerarlo un conocimiento básico completo, porque tengo varios enfoques en programación C# para resolver el mismo problema. Lo único que es necesario tener en cuenta es la diferencia entre UTF-8 puro y UTF-8 con una lista de materiales .

La semana pasada, en mi trabajo, necesitaba desarrollar una funcionalidad que generara archivos CSV con una BOM y otros archivos CSV con UTF-8 puro (sin una BOM). Cada tipo de codificación de archivo CSV será consumido por diferentes API no estandarizadas. Una API lee UTF-8 con una BOM y la otra API lee sin una BOM. Necesitaba investigar las referencias sobre este concepto, leyendo la pregunta de desbordamiento de pila "¿ Cuál es la diferencia entre UTF-8 y UTF-8 sin BOM? " y el artículo de Wikipedia " Marca de orden de bytes " para desarrollar mi enfoque.

Finalmente, mi programación en C# para ambos tipos de codificación UTF-8 (con BOM y pura) debía ser similar al siguiente ejemplo:

// For UTF-8 with BOM, equals shared by Zanoni (at top)
string result = System.Text.Encoding.UTF8.GetString(byteArray);

//for Pure UTF-8 (without B.O.M.)
string result = (new UTF8Encoding(false)).GetString(byteArray);
Antonio Leonardo avatar May 21 '2020 21:05 Antonio Leonardo