Obtendo um terminador nulo seqüência de System.Text.Encoding.Unicode.GetString
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.
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);