(En .NET) Tengo datos binarios arbitrarios almacenados en un byte [] (una imagen, por ejemplo). Ahora, necesito almacenar esos datos en una cadena (un campo "Comentario" de una API heredada). ¿Hay una técnica estándar para empaquetando esta información binaria en una cadena ? Al "empaquetar" quiero decir que para cualquier conjunto de datos razonablemente grande y aleatorio, bytes.Length/2 es aproximadamente lo mismo que packed.Length; porque dos bytes son más o menos un solo carácter.¿Existe una técnica estándar para empaquetar datos binarios en una cadena UTF-16?
Los dos "obvias" respuestas no cumplen todos los criterios:
string base64 = System.Convert.ToBase64String(bytes)
no hace un uso muy eficiente de la cadena de puesto que utiliza solamente 64 caracteres de aproximadamente 60.000 disponibles (mi el almacenamiento es un System.String). Ir con
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
hace un mejor uso de la cadena de , pero no va a trabajar para los datos que contiene caracteres Unicode no válidos (decir los pares suplentes pegaban mucho). This MSDN article muestra esta técnica exacta (pobre).
Veamos un ejemplo sencillo:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
En este caso bytes y utf16_bytes son los mismos, ya que el original bytes fuera una cadena UTF-16. Hacer este mismo procedimiento con la codificación base64 da 16 miembros base64_bytes matriz.
Ahora, repita el procedimiento con inválida de datos UTF-16:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
Encontrará que utf16_bytes no coinciden con los datos originales.
He escrito un código que usa U + FFFD como escape antes de caracteres Unicode no válidos; funciona, pero me gustaría saber si existe una técnica más estándar que algo que simplemente cociné por mi cuenta. Sin mencionar, no me gusta capturar ing DecoderFallbackException como la forma de detectar caracteres no válidos.
Supongo que podría llamar esto una codificación "base BMP" o "base UTF-16" (utilizando todos los caracteres en el plano multilingüe básico Unicode). Sí, idealmente seguiría Shawn Steele's advice y pasaría por byte [].
voy a ir con la sugerencia de Peter Housel como la respuesta "correcta", porque él es el único que estuvo cerca de lo que sugiere una "técnica estándar".
Editar base16klooks aún mejor. Jim Beveridge tiene un implementation.
Qué codificación Unicode exactamente? .NET usa UTF-8 de manera predeterminada, lo cual no es adecuado para este tipo de uso debido a las secuencias de escape o como se llame. –
Lo que quiero decir es que escaparse de cada par de bytes en UTF-8 es mucho más derrochador que el enfoque de "6 bits por 8" de Base64. –
@DrJokepu - del/2, ** presumiblemente ** UTF-16 –