Размер типов при записи в BinaryWriter

Размер каждого символа в ASCII (StreamWriter) занимает 1 байта, будь то число или символ.

Точно так же каков будет размер каждого символа, целого числа в двоичном формате? (BinaryWriter). Может кто-нибудь объяснить вкратце?


person hitesh jain    schedule 18.12.2015    source источник
comment
sizeof(char) == 2, поэтому длина одного символа 2 байта; однако размер Stream зависит от кодировки (Ascii, UTF-8 и т.д.) и самих символов: aaa (3 английские буквы a) может быть короче, чем ааа (3 русские буквы а)   -  person Dmitry Bychenko    schedule 18.12.2015
comment
char в C# — это UTF-16, это означает, что каждый символ занимает 2 байта. Интегральный тип зависит от его размера, то есть это может быть один байт (Byte), Short (16 бит), int (32 бит), long (64 бит).   -  person Yuval Itzchakov    schedule 18.12.2015
comment
Почти (но не совсем) каждый раз, когда я вижу, что кто-то использует BinaryWriter, они используют его по плохо обдуманным причинам. Что вам нужно сделать здесь? Будет ли бинарный сериализатор лучшим выбором? (есть несколько на выбор)   -  person Marc Gravell    schedule 18.12.2015
comment
Размер в байтах четко указан в каждом переопределении метода Write — не совсем уверен, какая еще информация вам нужна — т.е. BinaryWriter.Write(Int32) — записывает четырехбайтовое целое число со знаком в текущий поток и сдвигает позицию потока на четыре байта....   -  person Alexei Levenkov    schedule 18.12.2015
comment
@ Марк Гравелл , У каждого есть собственный выбор в работе над своим проектом . Тем не менее, люди говорят, что используют метод вместо свойств, и немногие говорят, что используют свойства вместо метода, но в конце концов это зависит от обстоятельств. Я использую BinaryWriter из-за его размера   -  person hitesh jain    schedule 18.12.2015
comment
Почему вы пишете первую букву в каждом слове с большой буквы? Из-за его размера? :D   -  person Hamid Pourjam    schedule 18.12.2015


Ответы (1)


Начнем с разницы между StreamWriter и BinaryWriter. StreamWriter предназначен для записи текстового представления в поток. StreamWriter преобразует все, что написано (с помощью метода Write*) в строку, затем преобразует с помощью кодировки в байты и записывает байты в базовый поток.

BinaryWriter предназначен для записи необработанных "примитивных" типов данных в поток. Для числовых типов он принимает представление в памяти, выполняет некоторую работу по нормализации представления (например, для обработки различий в порядке следования байтов), а затем записывает байты в базовый поток. Обратите внимание, что он также имеет кодировку, предоставленную в конструкторе. Это используется только для преобразования char и string в байты. Кодировка по умолчанию — UTF8.

Размер каждого символа в ASCII (StreamWriter) занимает 1 байт, будь то число или символ.

Это утверждение несколько сбивает меня с толку. Позвольте мне уточнить. int 1 будет преобразовано в строку «1», которая кодируется в ASCII как 49, что действительно является одним байтом, но 100 будет преобразовано в строку «10000», которая кодируется в ASCII как 49 48 48 48 48, так что это 5 байтов. . При использовании BinaryWriter оба займут 4 байта (размер int).

Точно так же каков будет размер каждого символа, целого числа в двоичном формате? (Двоичный писатель). Может кто-нибудь объяснить вкратце?

Размер char зависит от кодировки, используемой как для BinaryWriter, так и для StreamWriter. Размер числовых типов, таких как int, long, double, является размером базовых типов, 4, 8 и 8 байтов соответственно. Объем записываемых данных документируется в каждой перегрузке записи файла BinaryWriter. Строки обрабатываются отдельно от char[] в BinaryWriter, и перед записью закодированных байтов к их длине добавляется префикс.

person Mike Zboray    schedule 18.12.2015