El uso de C#, ¿cuál es el método más eficaz de convertir una cadena que contiene datos binarios en una matriz de bytes

StackOverflow https://stackoverflow.com/questions/72176

  •  09-06-2019
  •  | 
  •  

Pregunta

Mientras que hay 100 formas para resolver el problema de la conversión, me estoy centrando en el rendimiento.

Dar que la cadena sólo contiene datos binarios, ¿cuál es el método más rápido, en términos de rendimiento, de la conversión de los datos a un byte[] (no char[]) en C#?

Aclaración:Esto no es ASCII de datos, en lugar de datos binarios que pasa a estar en una cadena.

¿Fue útil?

Solución

No estoy seguro de ASCIIEncoding.GetBytes se va a hacer, porque sólo admite la rango 0x0000 a 0x007F.

Informar a la cadena contiene sólo bytes.Pero una .RED de cadena es un array de caracteres, y 1 char es de 2 bytes (debido a un .RED de tiendas de cadenas como UTF16).Así que usted puede tener dos situaciones para almacenar los bytes 0x42 y 0x98:

  1. La cadena fue una cadena ANSI y contenidos bytes y se convierte en una cadena unicode, por lo tanto la bytes 0x00 0x42 0x00 0x98.(La cadena se almacena como 0x0042 y 0x0098)
  2. La cadena era sólo una matriz de bytes que typecasted o simplemente recibido a una cadena y se convirtió así en los siguientes bytes 0x42 0x98.(La cadena se almacena como 0x9842)

En la primera situación, el resultado sería 0x42 y 0x3F (ascii para "B?").La segunda situación 0x3F (ascii para la "?").Esto es lógico, ya que los caracteres están fuera de la validez de rango ascii y el codificador no saben qué hacer con esos valores.

Entonces, me pregunto por qué es una cadena de bytes?

  • Tal vez contiene un byte codificado como una cadena (por ejemplo Base64)?
  • Tal vez debería empezar con un char matriz o una matriz de bytes?

Si usted realmente tiene la situación 2 y desea obtener los bytes de esto usted debe utilizar el UnicodeEncoding.GetBytes de la llamada.Debido a que volverá 0x42 y 0x98.

Si a usted le gusta ir de una matriz de char byte de la matriz, la forma más rápida sería de cálculo de Referencias..Pero eso no es realmente bonito, y utiliza el doble de memoria.

public Byte[] ConvertToBytes(Char[] source)
{
    Byte[] result = new Byte[source.Length * sizeof(Char)];
    IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length);
    try
    {
        Marshal.Copy(source, 0, tempBuffer, source.Length);
        Marshal.Copy(tempBuffer, result, 0, result.Length);
    }
    finally
    {
        Marshal.FreeHGlobal(tempBuffer);
    }
    return result;
}

Otros consejos

Hay no hay tal cosa como una cadena ASCII en C#!Las cadenas de siempre contienen UTF-16.No darse cuenta de esto lleva a un montón de problemas.Dicho esto, el uso de los métodos mencionados antes del trabajo porque consideran que la cadena como codificación UTF-16 y transformar los caracteres de símbolos ASCII.

/EDIT en respuesta a la aclaración:¿cómo los datos binarios obtener en la cadena?Las cadenas no deben contener datos binarios (uso byte[] para eso).

Si quieres ir de una cadena binaria de datos, usted debe saber lo que la codificación se utiliza para convertir los datos binarios a una cadena en el primer lugar.De lo contrario, podría no acabar con el binario correcto de los datos.Así, la manera más eficiente es probable GetBytes() en una Codificación de la subclase (como UTF8Encoding), pero usted debe saber para asegurarse de que la codificación.

El comentario formulado por Kent Boogaart en la pregunta original, lo resume bastante bien.;]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top