2009-05-14 4 views
7

J'ai un tableau d'octets que je reçois d'une entité externe. C'est une taille fixe. Les octets contiennent une chaîne unicode, avec 0 valeurs pad le reste du tampon:Obtention d'une chaîne terminée par un caractère nul à partir de System.Text.Encoding.Unicode.GetString

Ainsi les octets pourrait être:

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

Je reçois ce tampon et la convertir en une chaîne comme si :

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

ce que je reviens est une chaîne qui ressemble à ceci:

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

Comment ca n Je dis à GetString de terminer la chaîne à la première valeur Unicode null (c'est-à-dire que je reviens juste "HELLO")?

Merci pour toute contribution.

Répondre

8

Si vous êtes sûr que le reste est \ 0, cela fonctionnerait:

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

Sinon, si vous voulez juste obtenir tout avant le premier null:

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

Notez que Unicode.GetString prendra soin des doubles \ 0s. Vous devriez juste chercher un seul \ 0.

1

Le moyen le plus simple serait de couper la chaîne après la conversion, comme déjà suggéré. Si vous connaissez le nombre de caractères à l'avance, vous pouvez utiliser la surcharge GetString qui prend un index de début et un nombre d'octets, afin d'obtenir la chaîne correcte, sans couper.

Si vous ne connaissez pas le nombre de caractères à l'avance et que vous souhaitez éviter de couper la chaîne par la suite, vous devez d'abord découper le tableau d'octets, afin de ne transmettre que les octets qui vous intéressent. signifie enlever tous les octets après et y compris la première paire de zéros.

Questions connexes