2010-04-07 23 views
10

de alguna manera no pude encontrar esto con una búsqueda en Google, pero siento que tiene que ser simple ... Necesito convertir una cadena en una matriz de bytes de longitud fija, p.ej escriba "asdf" en una matriz byte[20]. los datos se envían a través de la red a una aplicación de C++ que espera un campo de longitud fija, y funciona bien si uso un BinaryWriter y escribo los caracteres uno por uno, y lo relleno escribiendo '\ 0' un número apropiado de veces.Escribir una cadena en una matriz de bytes de longitud fija en C#

¿hay una forma más adecuada de hacerlo?

Respuesta

19
static byte[] StringToByteArray(string str, int length) 
{ 
    return Encoding.ASCII.GetBytes(str.PadRight(length, ' ')); 
} 
+2

Esto rellenará el búfer con espacios (0x20), no el carácter nulo (0x0) mencionado por el cartel. De lo contrario, esto es genial. – Dathan

+0

sí, pero funciona bien si solo uso '\ 0' en su lugar. ¡Gracias! – toasteroven

+2

Además, asegúrese de que "str" ​​no sea> 20 caracteres, o tendrá problemas ... –

2

Puede usar Encoding.GetBytes.

byte[] byteArray = new byte[20]; 
Array.Copy(Encoding.ASCII.GetBytes(myString), byteArray, System.Math.Min(20, myString.Length); 
+0

usando System.Math.Min es un enfoque inteligente. – Demir

5

¿Qué tal

String str = "hi"; 
Byte[] bytes = new Byte[20]; 
int len = str.Length > 20 ? 20 : str.Length; 
Encoding.UTF8.GetBytes(str.Substring(0, len)).CopyTo(bytes, 0); 
+0

Si str.Length> 20, esto no funcionará ... –

+0

@Reed Buena llamada. He solucionado ese error. – Dathan

1

Con código no seguro, tal vez?

unsafe static void Main() { 
    string s = "asdf"; 
    byte[] buffer = new byte[20]; 
    fixed(char* c = s) 
    fixed(byte* b = buffer) { 
     Encoding.Unicode.GetBytes(c, s.Length, b, buffer.Length); 
    } 
} 

(los bytes en el buffer el valor de 0, pero siempre se les puede poner a cero manualmente)

1
Byte[] bytes = new Byte[20]; 
String str = "blah"; 

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
bytes = encoding.GetBytes(str); 
4

Ésta es una manera de hacerlo:

string foo = "bar"; 

    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(foo); 

    Array.Resize(ref bytes, 20); 
1

Y justo para completar, LINQ:

(str + new String(default(Char), 20)).Take(20).Select(ch => (byte)ch).ToArray(); 

Para variación, th es snippet también elige convertir el carácter Unicode directamente en ASCII, ya que los primeros 127 caracteres Unicode se definen para que coincidan con ASCII.

Cuestiones relacionadas