2009-09-09 7 views
22

J'ai un tableau d'octets semblable à celui (16 octets):La chaîne du tableau d'octets n'est pas tronquée en C#?

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00 

Je l'utiliser pour le convertir en une chaîne et couper les espaces de fin:

ASCIIEncoding.ASCII.GetString(data).Trim(); 

Je reçois la chaîne bien, Cependant, il a toujours tous les espaces de fin. Donc, je reçois quelque chose comme "qwerty.........." (où les points sont des espaces en raison de StackOverflow).

Qu'est-ce que je fais mal?

J'ai également essayé d'utiliser .TrimEnd() et d'utiliser un encodage UTF8, mais cela ne change rien.

Merci à l'avance :)

+3

ne se termine votre tableau d'octets en 00 octets ou 20 octets? Un espace est 0x20 pas 0x00. –

+1

Si votre tableau d'octets provient d'un MemoryStream, assurez-vous que vous appelez 'ToArray()' et non 'GetBuffer()', car GetBuffer inclura des données "non remplies", résultant en tous ces –

Répondre

31

Vous devez faire TrimEnd(new char[] { (char)0 }); pour résoudre ce problème. Ce ne sont pas des espaces - ce sont en fait des caractères nuls qui sont convertis bizarrement. J'ai eu ce problème aussi.

+6

terminateurs null de \ 0 n'ont rien à faire avec l'encodage ASCII. Il semble que @Lazlo possède un tableau d'octets de taille fixe qui contient une chaîne codée en ASCII à longueur variable, donc la chaîne doit être complétée avec des terminaisons NULL pour correspondre à la taille du tableau – dtb

+0

@dtb: Right. Droite droite –

+0

Merci :) Je pensais que c'était quelque chose comme ça, mais je n'ai pas osé essayer. – Lazlo

20

Ils sont pas vraiment des espaces:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0') 

... devrait faire l'affaire.

-Oisin

7

Version par défaut removes only whitespace, où les espaces est défini par char.IsWhitespace.

'\0' est un caractère de contrôle, pas un espace.

Vous pouvez spécifier les caractères à l'aide de la garniture Trim(char[]) surcharge:

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' }); 
1

Pourquoi essayer de créer la chaîne première et de l'assiette seconde? Cela pourrait ajouter beaucoup de surcharge (si l'octet [] est grand). Vous pouvez spécifier index et count dans la surcharge GetString(byte[] bytes, int index, int count).

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 
0

En Powershell, vous pouvez le faire:

$yourString.TrimEnd(0x00) 
Questions connexes