Работа BinaryReader и BinaryWriter

246
22 января 2018, 05:06

Никак не могу понять как работают BinaryReader и BinaryWriter? Зачем в конструктор передаётся true, написано "чтобы при необходимости поток оставался открытым", что это означает? При какой необходимости поток должен оставаться открытым? Как вообще осуществляется передача строки в BinaryWriter? Если я правильно понял, то через BinaryWriter отправляется, что-то вроде массива типа Byte, то есть каждый символ кодируется как набор 0-й и 1-ц и добавляется в массив и пока не будет достигнут конец сообщения, данные будут отправляться.

reader = new BinaryReader(stream, Encoding.Unicode, true);
writer = new BinaryWriter(stream, Encoding.Unicode, true);

Также не понятно как работает метод BinaryReader.ReadString()? Как я понял он получает длину строки, потом саму строку. То есть декодирует массив типа Byte в указанную кодировку и сразу записывает декодированные символы в строку, до тех пор пока он не достиг конца строки, и если отправка сообщения приостановлена, то он будет ждать пока она не возобновиться. На msdn сказано, что "метод BinaryReader.ReadString () считывает число блоками по 7 бит", это значит он получает число и делит его на блоки по 7 бит? Сразу же возникают другие вопросы: зачем он делит число на блоки по 7 бит, какой тип данных передаётся в BinaryReader.ReadString ()? Я думаю, что передаётся массив типа Byte то есть само сообщение, а перед ним некое число типа Int32- длина строки.

Answer 1

Класс BinaryWriter реализует интерфейс IDisposable. Передавая в конструктор true в качестве последнего параметра можно задать, будет ли писатель закрыт при вызове IDisposable.Dispose.

Что касается "число блоками по 7 бит", то это имеется ввиду используемый в этих читателях/писателях способ сжатой записи для int:

  • в каждый байт записываются по 7 бит, начиная с младших разрядов;
  • если все более старшие биты в числе после записанных нулевые, то запись останавливается;
  • старший бит используется в качестве индикатора окончания числа, т.е. если он выставлен, то следующий байт содержит продолжение числа, а если нет - то число закончилось;

Такой подход позволяет экономить место при записи коротких чисел. Например для записи числа 127 потребуется тольк 1 байт вместо 4, для 1257 потребуется 2 байта. Однако при этом получается оверхед для больших чисел, да и запись / чтение производится медленее.

Перед строкой записывается ее длинна в такой упакованной форме, а затем содержимое строки как есть.

READ ALSO
ASP.NET MVC VK callback API

ASP.NET MVC VK callback API

Задача: Нужно сделать ВК бота который будет делать рассылку сообщенийРеализация на ASP

325
Проверка правописания в Atom ( код на JavaScript )

Проверка правописания в Atom ( код на JavaScript )

Как правильно настроить плагин "Spell Check" в Atom, чтобы он корректно проверял правописание? Я добавил флаги в настройки грамматики :

294
Генерации сочетания в JavaScript

Генерации сочетания в JavaScript

Как можно сгенерировать случайное сочетание в JavaScript?

346
Функция array.map

Функция array.map

Подскажите, как перебрать массив auto и в зависимости от значения item вернуть в result определенное значение?

317