2015. szeptember 18., péntek

MONO és a lezáró nulla

Gyakori feladat, hogy egy .NET C# NetworkStreamből kell kiolvasni a benne rejlő adatot a NetworkStream.Read(byte[] buffer, int offset, int size):int metódussal.

Az alábbi linken van hozzá egy jó módszer, miként célszerű használni:
https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.dataavailable(v=vs.110).aspx

Fontos odafigyelni a Read hívásánál, hogy a visszatérési értékben kapjuk meg, hogy hány bájt volt a ténylegesen kiolvasott adat. Ne akarjunk a pufferből annál több elemet kiolvasni, a stringgé alakításkor a többi karakter a '\0' értéket fogja felvenni.

Ha mégis megfeledkeznénk erről és a teljes puffer tartalmát használjuk, akkor sem fog hibát dobni. Viszont létezik olyan .NET C# implementáció, mint a MONO, amiben a '\0' a null-terminator, azaz a stringet "lezáró nulla", emiatt pedig mindent eldob, ami utána van.

Ez a viselkedés olyan értelmetlennek tűnő szituációkat tud teremteni, mint hogy az így előállított stringhez a konkatenációval nem lehet semmit sem hozzáfűzni, és még hibát sem dob.

Bővebben a C++ lezáró nulla karakterről:
https://msdn.microsoft.com/en-us/library/69ze775t.aspx

Nincsenek megjegyzések:

Megjegyzés küldése