2009-05-14 13 views
7

Tengo una matriz de bytes que recibo de una entidad externa. Es un tamaño fijo. Los bytes contienen una cadena Unicode, con 0 valores para rellenar el resto de la memoria intermedia:Obtención de cadena terminada en nulo desde System.Text.Encoding.Unicode.GetString

Así los bytes podría ser:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

Estoy consiguiendo ese búfer y convertirla en una cadena como por lo :

byte[] buffer = new byte[buffSize]; 
m_dataStream.Read(buffer, 0, buffSize); 
String cmd = System.Text.Encoding.Unicode.GetString(buffer); 

Lo que se obtiene es una cadena que tiene este aspecto:

"HELLO\0\0\0\0\0\0\0\0..." 

Cómo ca n Le digo a GetString que finalice la cadena en el primer nulo de Unicode (es decir, ¿así que simplemente vuelvo a "HOLA")?

Gracias por cualquier entrada.

Respuesta

8

Si está seguro de que el resto es todo \ 0, esto funcionaría:

cmd = cmd.TrimEnd('\0'); 

De lo contrario, si lo que desea es tener todo antes de que el primer nulo:

int index = cmd.IndexOf('\0'); 
if (index >= 0) 
    cmd = cmd.Remove(index); 

Tenga en cuenta que Unicode.GetString se ocupará de double \ 0s. Deberías buscar solo un \ 0.

1

La manera más fácil sería recortar la cadena después de la conversión, como ya se ha sugerido.

Si conoce el recuento de caracteres por adelantado, puede usar la sobrecarga GetString que toma un índice inicial y un recuento de bytes, para obtener la cadena correcta, sin recortar.

Si no conoce el recuento de caracteres por adelantado y desea evitar recortar la cadena después, primero debe recortar el conjunto de bytes, de modo que solo pase los bytes que le interesen. Para Unicode, esto sería significa eliminar cualquier byte después e incluir el primer par de ceros.

Cuestiones relacionadas