Я работаю над синтаксическим анализатором для получения информации UDP, ее анализа и сохранения. Для этого я использую BinaryReader
, поскольку в основном это будет двоичная информация. Хотя некоторые из них будут строками. MSDN говорит о функции ReadString()
:
Читает строку из текущего потока. Строка имеет префикс длины, закодированный как целое число семь бит за раз.
И я полностью это понимаю вплоть до «семи битов за раз», которые я пытался просто игнорировать, пока не начал тестировать. Я создаю свой собственный массив байтов, прежде чем помещать его в MemoryStream
и пытаться прочитать его с помощью BinaryReader
. Вот то, что я сначала подумал, будет работать:
byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', }
BinaryReader reader = new BinaryReader(new MemoryStream(data));
String str = reader.ReadString();
Зная, что int
составляет 4 байта (и поигравшись достаточно долго, чтобы выяснить, что BinaryReader
— это Little Endian), я передаю ему длину 3 и соответствующие буквы. Однако str
в конечном итоге держит \0\0\0
. Если я уберу 3 нуля и просто
byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', }
Затем он правильно читает и сохраняет Cat
. Для меня это противоречит документации, в которой говорится, что длина должна быть целым числом. Теперь я начинаю думать, что они просто означают число без десятичной точки, а не тип данных int
. Означает ли это, что BinaryReader
никогда не сможет прочитать строку, длиннее 127 символов (поскольку это будет 01111111, что соответствует 7-битной части документации)?
Я пишу протокол, и мне нужно полностью понять, во что я ввязываюсь, прежде чем передать нашу документацию нашим клиентам.
ReadString
и использовать твердые 4 байта для длины и использоватьReadChars
, чтобы его было проще реализовать. - person Corey Ogburn   schedule 31.10.2013