String de Byte Array não é aparado em C#?
Pergunta
Eu tenho uma matriz de bytes semelhante a este (16 bytes):
71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
Eu uso isso para convertê -lo em uma corda e aparar os espaços finais:
ASCIIEncoding.ASCII.GetString(data).Trim();
Eu fico bem na corda, no entanto, ela ainda tem todos os espaços finais. Então eu entendo algo como "qwerty.........."
(onde os pontos são espaços devido ao StackOverflow).
O que estou fazendo errado?
Também tentei usar .TriMend () e usar uma codificação UTF8, mas isso não muda nada.
Desde já, obrigado :)
Solução
Você tem que fazer TrimEnd(new char[] { (char)0 });
Para consertar isso. Não são espaços - na verdade são personagens nulos que são convertidos estranhamente. Eu também tive esse problema.
Outras dicas
Eles não são realmente espaços:
System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0')
... deve fazer o truque.
-Oisin
TRIM por padrão Remove apenas o espaço em branco, onde o espaço em branco é definido por char.IsWhitespace
.
'\0'
é um personagem de controle, não espaço em branco.
Você pode especificar quais caracteres aparar usando o Trim(char[])
sobrecarga:
string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' });
Por que tentar criar a string primeiro e apará -la em segundo? Isso pode adicionar muita sobrecarga (se o byte [] for grande).
Você pode especificar index
e count
no GetString(byte[] bytes, int index, int count)
sobrecarga.
int count = data.Count(bt => bt != 0); // find the first null
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want
Em PowerShell, você pode fazer isso:
$yourString.TrimEnd(0x00)