Pregunta

I tienen una serie 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:

Así que los bytes podría ser:

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

Me estoy poniendo ese búfer y convertirla en una cadena de este modo:

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 puedo saber GetString para terminar la cadena en el primer nulo Unicode (es decir, por lo que sólo vuelva "HOLA")?

Gracias por cualquier entrada.

¿Fue útil?

Solución

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 hará cargo de 0s \ dobles. Usted sólo debe buscar una sola \ 0.

Otros consejos

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

Si conoce el recuento de caracteres con antelación, se puede utilizar la sobrecarga de GetString que tiene un índice de inicio y un recuento de bytes, con el fin de obtener la cadena correcta, sin recortar.

Si no se conoce el recuento de caracteres por adelantado, y desea evitar el recorte de la cadena después, necesita recortar la matriz de bytes en primer lugar, por lo que sólo pasa los bytes le interesa. Para Unicode, esto significaría la eliminación de cualquier bytes después de e incluyendo el primer par de ceros.

En lugar de volver a procesar la cadena se puede obtener la primera aparición del byte nulo en la memoria intermedia (utilizando System.Array.IndexOf). A continuación, puede utilizar el método sobrecargado System.Text.Encoding.Unicode.GetString para crear una cadena de hasta el tamaño del búfer dado.

El ejemplo siguiente también abastece de un tampón que contiene no hay bytes nulos:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top