La chaîne du tableau d'octets n'est pas tronquée en C #?
Question
J'ai un tableau d'octets semblable à celui-ci (16 octets):
71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
Je l'utilise pour convertir une chaîne et couper les espaces finaux:
ASCIIEncoding.ASCII.GetString(data).Trim();
La chaîne est correcte, mais elle contient toujours tous les espaces finaux.
Je reçois donc quelque chose comme "qwerty .........."
(où les points sont des espaces dus à StackOverflow).
Qu'est-ce que je fais de travers?
J'ai aussi essayé d'utiliser .TrimEnd () et un encodage UTF8, mais cela ne change rien.
Merci d'avance :)
La solution
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 étrangement convertis. J'ai eu ce problème aussi.
Autres conseils
Ils ne sont pas vraiment des espaces:
System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0')
... devrait faire l'affaire.
-Oisine
Couper par défaut supprime uniquement les espaces , les espaces étant définis par char.IsWhitespace
.
'\ 0'
est un caractère de contrôle, pas un espace.
Vous pouvez spécifier les caractères à supprimer à l'aide du Trim (char [ ])
surcharge:
string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' });
Pourquoi essayer de créer la chaîne en premier et de la couper en second? Cela pourrait ajouter beaucoup de temps (si l'octet [] est grand).
Vous pouvez spécifier index
et count
dans GetString (octet [] octets, int index, int count)
surcharge.
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
Dans PowerShell, vous pouvez faire ceci:
$yourString.TrimEnd(0x00)