2009-05-14 10 views
7

null sonlandırılmış dizesi alma Harici bir varlıktan aldığım bir dizi baytım var. Bu sabit bir boyuttur. bayt tampon geri kalanı dışarı pad 0 değerlere sahip bir unicode dize içeren:System.Text.Encoding.Unicode.GetString

Yani bayt olabilir:

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

O tampon alma ve şöyle bir dizeye dönüştürme ediyorum :

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

Nasıl ca:

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

ne ben dönene şöyle bir dizedir n GetString'e ilk Unicode boşluğundaki dizgeyi sonlandırmasını söylerim (yani sadece "HELLO" mesajını geri alırım)?

Herhangi bir girdi için teşekkürler. Eğer geri kalan tüm \ 0 olduğundan eminseniz

cevap

8

, bu işe yarar:

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

Yoksa, sadece birinci sıfır önce her şeyi almak istiyorsanız:

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

Not o Unicode.GetString, double \ 0'larla ilgilenir. Sadece bir tane beklemelisiniz \ 0.

1

Önceden önerildiği gibi, dönüştürmeden sonra dizgiyi kırpmanın en kolay yolu.

Önceden karakter sayısını biliyorsanız, doğru dizeyi düzeltmek için, kırpma olmadan bir başlangıç ​​dizini ve bayt sayısı alan GetString yüklemesini kullanabilirsiniz.

Karakter sayısını önceden bilmiyorsanız ve sonra dizeyi kırpmaktan kaçınmak istiyorsanız, önce bayt dizisini kırpmanız gerekir, böylece yalnızca ilgilendiğiniz baytları geçirmeniz gerekir. Unicode için bu ilk sıfır çiftini dahil ettikten sonra, herhangi bir bayt kaldırmak anlamına gelir.