Tengo una byte[]
matriz que se carga desde un archivo que conozco contiene UTF-8 .
En algún código de depuración, necesito convertirlo en una cadena. ¿Hay un trazador de líneas que haga esto?
Debajo de las cubiertas debe ser solo una asignación y una copia de memoria , por lo que incluso si no se implementa, debería ser posible.
Respuestas:
fuente
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Hay al menos cuatro formas diferentes de hacer esta conversión.
GetString de codificación
, pero no podrá recuperar los bytes originales si esos bytes tienen caracteres no ASCII.
BitConverter.ToString
La salida es una cadena delimitada "-", pero no hay un método incorporado de .NET para convertir la cadena de nuevo a una matriz de bytes.
Convert.ToBase64String
Puede convertir fácilmente la cadena de salida de nuevo a matriz de bytes mediante
Convert.FromBase64String
.Nota: La cadena de salida podría contener '+', '/' y '='. Si desea utilizar la cadena en una URL, debe codificarla explícitamente.
HttpServerUtility.UrlTokenEncode
Puede convertir fácilmente la cadena de salida a una matriz de bytes mediante
HttpServerUtility.UrlTokenDecode
. ¡La cadena de salida ya es compatible con URL! La desventaja es que necesitaSystem.Web
ensamblaje si su proyecto no es un proyecto web.Un ejemplo completo:
fuente
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Una solución general para convertir una matriz de bytes a una cadena cuando no conoce la codificación:
fuente
Definición:
Utilizando:
fuente
La conversión de a
byte[]
astring
parece simple, pero es probable que cualquier tipo de codificación estropee la cadena de salida. Esta pequeña función simplemente funciona sin ningún resultado inesperado:fuente
Utilizando
(byte)b.ToString("x2")
, Salidasb4b5dfe475e58b67
fuente
También hay una clase UnicodeEncoding, bastante simple de usar:
fuente
UnicodeEncoding
es el peor nombre de la clase; Unicode no es una codificación en absoluto. Esa clase es en realidad UTF-16. La versión little-endian, creo.Alternativamente:
fuente
Una línea única de Linq para convertir una matriz de bytes
byteArrFilename
leída de un archivo a una cadena de terminación cero de estilo ascii C puro sería esta: útil para leer cosas como tablas de índice de archivos en formatos de archivo antiguos.Utilizo
'?'
como char predeterminado para cualquier cosa que no sea puramente ascii aquí, pero eso se puede cambiar, por supuesto. Si quiere asegurarse de poder detectarlo, simplemente use'\0'
, ya queTakeWhile
al principio se asegura de que una cadena construida de esta manera no pueda contener'\0'
valores de la fuente de entrada.fuente
BitConverter
La clase se puede utilizar para convertir unbyte[]
astring
.La documentación de la
BitConverter
clase se puede encontrar en MSDNfuente
Que yo sepa, ninguna de las respuestas dadas garantiza un comportamiento correcto con terminación nula. Hasta que alguien me muestre de manera diferente, escribí mi propia clase estática para manejar esto con los siguientes métodos:
La razón de esto
startIndex
fue en el ejemplo en el que estaba trabajando específicamente, necesitaba analizarbyte[]
un conjunto de cadenas terminadas en nulo. Se puede ignorar con seguridad en el caso simplefuente
byteArr.TakeWhile(x => x != 0)
es una forma rápida y fácil de resolver el problema de terminación nula.hier es un resultado en el que no tuvo que molestarse con la codificación. Lo usé en mi clase de red y envié objetos binarios como una cadena con él.
fuente
Además de la respuesta seleccionada, si está utilizando .NET35 o .NET35 CE, debe especificar el índice del primer byte para decodificar y el número de bytes para decodificar:
fuente
Prueba esta aplicación de consola:
fuente
Vi algunas respuestas en esta publicación y es posible que se considere un conocimiento base completo, porque tengo varios enfoques en la programación de C # para resolver el mismo problema. Solo una cosa que es necesario tener en cuenta es la diferencia entre UTF-8 puro y UTF-8 con BOM .
En la semana pasada, en mi trabajo, necesito desarrollar una funcionalidad que genere archivos CSV con BOM y otros CSV con UTF-8 puro (sin BOM), cada tipo de codificación de archivos CSV será consumido por diferentes API no estandarizadas, esa API leyó UTF-8 con BOM y la otra API leyó sin BOM. Necesito investigar las referencias sobre este concepto, leyendo " ¿Cuál es la diferencia entre UTF-8 y UTF-8 sin BOM? " Discusión de desbordamiento de pila y este enlace de Wikipedia " Marca de orden de bytes " para construir mi enfoque.
Finalmente, mi programación de C # para los dos tipos de codificación UTF-8 (con BOM y puro) tenía que ser similar a este ejemplo a continuación:
fuente