2009-05-14 11 views
7

Ich habe ein Array von Bytes, die ich von einer externen Entität empfange. Es ist eine feste Größe. Das Bytes enthält einen Unicode-String, mit 0 Werten zu polstern den Rest des Puffers:NULL-Zeichenfolge mit Endung von System.Text.Encoding.Unicode.GetString

So könnte der Bytes sein:

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

ich diesen Puffer bekommen und es in einen String konvertieren wie so :

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

Was bekomme ich wieder eine Zeichenfolge, die wie folgt aussieht:

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

Wie ca n Ich sage GetString, um die Zeichenkette bei der ersten Unicode-Null zu beenden (dh ich bekomme gerade "HALLO" zurück)?

Danke für jede Eingabe.

Antwort

8

Wenn Sie der Rest sind sicher, dass alles \ 0, das funktionieren würde:

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

Andernfalls, wenn Sie nur wollen alles bekommen, bevor der erste Null:

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

Beachten Sie, dass Unicode.GetString wird sich um doppelte \ 0s kümmern. Sie sollten nur nach einem einzigen \ 0 suchen.

1

Der einfachste Weg wäre, die Zeichenfolge nach der Konvertierung zu trimmen, wie bereits vorgeschlagen.

Wenn Sie die Anzahl der Zeichen im Voraus kennen, können Sie die GetString-Überladung verwenden, die einen Startindex und eine Anzahl von Bytes benötigt, um die richtige Zeichenfolge ohne Trimmen zu erhalten.

Wenn Sie die Zeichenanzahl nicht im Voraus kennen und die Zeichenfolge danach nicht reduzieren möchten, müssen Sie zuerst das Bytearray trimmen, sodass Sie nur die Bytes übergeben, die Sie interessieren. Für Unicode würde dies der Fall sein bedeutet, alle Bytes nach und einschließlich des ersten Nullenpaars zu entfernen.