C# Konwersja byte na stringa problem z pustymi miejscami


(Jarek P) #1

Witam.

Piszę prosty program do komunikacji za pomocą tcp. Do odbierania wiadomości wykorzystuje taki oto kod:

NetworkStream nt = cl.GetStream();

                    byte[] bufer = new byte[200];

                    nt.Read(bufer, 0, bufer.Length);



                    string control = Encoding.ASCII.GetString(bufer);

Ale mam problem z długością "bufera". Otrzymuje stringa w postaci "to_co_ma_być\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0..."

Jak pozbyć się tych pustych miejsc ? Mógłbym użyć split'a, ale to mało optymalne rozwiązanie. Jakieś sugestie ?


(Tomek Matz) #2

Musisz opracować jakiś swój mini protokół. Najpierw przesyłaj informację o tym z jakiej ilości bajtów będzie się składać wiadomość (12), a dopiero potem ją odczytuj (to_co_ma_być). W ten sposób unikniesz pustych znaków.


(Fiołek) #3

Albo skorzystaj z wartości zwracanej przez Stream.Read.


(Tomek Matz) #4

@Fiołek

Mógłbyś to zademonstrować w praktyce?


(Fiołek) #5

Na powyższym przykładzie:

NetworkStream nt = cl.GetStream();byte[] bufer = new byte[200];int read = nt.Read(bufer, 0, bufer.Length);string control = Encoding.ASCII.GetString(bufer, 0, read);GlobalBuffer += content; //Odkładamy to, co wczytaliśmy, by nie zgubić niczego(co z tym robimy potem to już zależy od aplikacji)[/code]

Kwestia tego, co chcemy osiągnąć. Nie twierdzę, że objedzie się bez wskazywania na koniec, ale to nie koniecznie musi być ilość bajtów. Może to być jakiś "znacznik końca"(np. 0xDEADBEEF jako tekst) albo gdy wydajemy polecenia o "skończonej liczbie znaków" nawet tego nie potrzeba - ot zwykłe porównanie wystarczy(lista komend to np. abc, cda, wypisz, wymaluj - każda unikatowa, bez parametrów, ale i parametry można jakieś dodać bez większego problemu). Gdy nie ma potrzeby nie warto sobie utrudniać(bo i tak się będzie zmieniać dużo razy, jeśli się nie ma jako takiego doświadczenia - ostatnio dość mocno to odczułem).