Pergunta

Eu tenho uma matriz de bytes que eu receber de uma entidade externa. É um tamanho fixo. Os bytes conter uma seqüência de caracteres Unicode, com 0 valores para preencher o resto do buffer:

Assim, os bytes podem ser:

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

Estou recebendo esse buffer e convertê-lo para uma string assim:

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

O que eu voltar é uma string que se parece com isso:

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

Como posso saber GetString para terminar a corda no primeiro nulo Unicode (ou seja, assim que eu apenas voltar "OLÁ")?

Obrigado por qualquer entrada.

Foi útil?

Solução

Se você tem certeza que o resto é tudo \ 0, isso iria funcionar:

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

Caso contrário, se você só quer ter tudo antes do primeiro nulo:

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

Note que Unicode.GetString vai cuidar de duplas \ 0s. Você deve apenas olhar para um único \ 0.

Outras dicas

A maneira mais fácil seria a de cortar a corda após a conversão, como já foi sugerido.

Se você sabe a contagem de caracteres com antecedência, você pode usar a sobrecarga GetString que tem um índice de início e uma contagem de bytes, a fim de obter a seqüência correta, sem cortar.

Se você não sabe a contagem de caracteres de antecedência, e gostaria de evitar o corte a corda depois, você precisa cortar a matriz de bytes em primeiro lugar, para que você só passar os bytes que você está interessado. Por Unicode, isso significaria removendo quaisquer bytes depois e incluindo o primeiro par de zeros.

Ao invés de reprocessamento a seqüência que você pode obter a primeira ocorrência do byte nulo no buffer (usando System.Array.IndexOf). Você pode então usar o método System.Text.Encoding.Unicode.GetString sobrecarregado para criar uma seqüência de até um determinado tamanho do buffer.

O exemplo abaixo também serve para um tampão contendo não nulo bytes:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top