2009-05-14 11 views
7

Mam tablicę bajtów, które otrzymuję od obiektu zewnętrznego. Jest to stały rozmiar. Bajty zawierają ciąg znaków Unicode, z 0 wartości pad z resztą bufora:Uzyskiwanie łańcucha zakończonego znakiem null z System.Text.Encoding.Unicode.GetString

Więc bajtów może być:

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

Dostaję ten bufor i przekształcenie go na sznurku, tak jak :

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

Co wrócę to ciąg znaków, który wygląda tak:

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

Jak ca n Mówię programowi GetString, aby zakończył łańcuch przy pierwszej wartości Unicode (tzn. po prostu wróciłem "HELLO")?

Dzięki za wszelkie dane wejściowe.

Odpowiedz

8

Jeśli masz pewność, że reszta jest wszystko \ 0, to będzie działać:

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

W przeciwnym razie, jeśli tylko chcą, aby wszystko przed pierwszym zerową:

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

Należy zauważyć, że Unicode.GetString zajmie się podwójnym \ 0s. Powinieneś po prostu poszukać pojedynczego \ 0.

1

Najprostszym sposobem byłoby przycięcie łańcucha po konwersji, jak już sugerowano.

Jeśli znasz liczbę znaków z góry, możesz użyć przeciążenia GetString, które pobiera indeks początkowy i liczbę bajtów, aby uzyskać poprawny ciąg bez przycinania.

Jeśli nie znasz liczby znaków z góry i chciałbyś uniknąć przycięcia napisu, musisz najpierw przyciąć tablicę bajtów, tak abyś tylko przekazywał bajty, które cię interesują. W przypadku Unicode byłby to oznacza usunięcie wszystkich bajtów po pierwszej liczbie zer i włącznie z nią.

Powiązane problemy