Question

I ai un tableau d'octets que je reçois à partir d'une entité externe. Il est une taille fixe. Les octets contiennent une chaîne de caractères unicode, avec 0 valeurs de tampon sur le reste de la mémoire tampon:

Alors 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 ceci:

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 puis-je dire GetString de mettre fin à la chaîne au premier null Unicode (ie si je reçois tout juste « BONJOUR »)?

Merci pour toute entrée.

Était-ce utile?

La solution

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

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

Dans le cas contraire, si vous voulez juste obtenir tout avant le premier null:

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

Notez que prendra soin Unicode.GetString de doubles \ 0s. Vous devez juste chercher un \ 0.

Autres conseils

La façon la plus simple serait de couper la chaîne après la conversion, comme cela a déjà suggéré.

Si vous connaissez le nombre de caractères à l'avance, vous pouvez utiliser la surcharge GetString qui prend un indice de départ et un nombre d'octets, afin d'obtenir la chaîne correcte, sans coupe.

Si vous ne connaissez pas le nombre de caractères à l'avance, et que vous souhaitez éviter la coupe de la chaîne après, vous devez couper le tableau d'octets premier, vous passez uniquement les octets qui vous intéresse. Pour Unicode, cela signifierait élimination de tout octets après et y compris la première paire de zéros.

Au lieu de retraiter la chaîne que vous pouvez obtenir la première occurrence de l'octet nul dans la mémoire tampon (en utilisant System.Array.IndexOf). Vous pouvez ensuite utiliser la méthode surchargée pour créer System.Text.Encoding.Unicode.GetString une chaîne jusqu'à la taille du tampon donné.

L'exemple ci-dessous répond aussi à un tampon ne contenant pas d'octets nuls:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top