Frage

Ich habe ein Array von Bytes, die ich von einer externen Einheit empfangen. Es ist eine feste Größe. Das Bytes enthält einen Unicode-String, mit 0 Werten zu polstern den Rest des Puffers:

So werden die Bytes könnte sein:

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

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

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

Was ich zurück bekommen, ist eine Zeichenfolge, die wie folgt aussieht:

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

Wie kann ich GetString sage die Zeichenfolge am ersten Unicode null zu beenden (dh so dass ich nur wieder „HALLO“)?

Vielen Dank für jede Eingabe.

War es hilfreich?

Lösung

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

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

Ansonsten, wenn Sie nur wollen, alles vor dem ersten Null erhalten:

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

, dass Unicode.GetString Hinweis wird von Doppel \ 0s kümmern. Sie sollten für eine einzelne \ 0 anschauen.

Andere Tipps

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

Wenn Sie die Anzahl der Zeichen im Voraus wissen, könnten Sie die GetString Überlastung verwenden, die einen Startindex und eine Anzahl von Bytes, um die richtige Zeichenfolge zu bekommen nimmt, ohne Beschnitt.

Wenn Sie nicht über die Anzahl der Zeichen im Voraus wissen, und würden die Zeichenfolge danach zu vermeiden wie Beschneiden, müssen Sie zuerst den Byte-Array trimmen, so dass Sie nur das Bytes übergeben Sie interessiert sind. Für Unicode, würde dies bedeuten, jedes Bytes nach und einschließlich das ersten Paar von Nullen zu entfernen.

Anstatt die Zeichenfolge Aufbereitung können Sie das erste Auftreten des Null-Byte in dem Puffer (mit System.Array.IndexOf) erhalten. Anschließend können Sie die überladene System.Text.Encoding.Unicode.GetString Methode verwenden, um eine Zeichenfolge bis zu der gegebenen Puffergröße zu erstellen.

Das folgende Beispiel auch eignet sich für einen Puffer keine Null-Bytes enthalten:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top