OOP Course
Сьогодні

Підрозділ 18.5

BinaryReader та BinaryWriter. Бінарні потоки

18.5. BinaryReader та BinaryWriter. Бінарні потоки StreamReader / StreamWriter чудово підходять для текстових даних. Але медичні системи часто мають справу з даними зовсім іншої природи: показники датчиків — по

18.5. BinaryReader та BinaryWriter. Бінарні потоки

StreamReader/StreamWriter чудово підходять для текстових даних. Але медичні системи часто мають справу з даними зовсім іншої природи: показники датчиків — послідовності чисел з плаваючою комою, архіви кардіограм — тисячі 16-бітних відліків, медичні зображення — мільйони байтів з пікселями. Зберігати такі дані у текстовому форматі неефективно: рядок "98.6" займає 4 байти (символи), тоді як значення float 98.6f у бінарному форматі займає рівно 4 байти і зчитується без конвертації. Для роботи з типізованими бінарними даними C# надає BinaryWriter та BinaryReader.

BinaryWriter і BinaryReader — теж декоратори над Stream (як StreamWriter/StreamReader), але вони оперують не рядками, а C#-типами безпосередньо: int, double, bool, string, byte[]. Дані записуються у внутрішньому представленні .NET (little-endian для чисел) без будь-якого текстового кодування.

Бінарний vs текстовий формат зберігання

BinaryWriter — запис типізованих даних

Метод Write у BinaryWriter перевантажений для всіх примітивних типів C#: bool, byte, sbyte, char, short, ushort, int, uint, long, ulong, float, double, decimal, string, а також byte[] і char[]. Кожен тип записується у точній кількості байт свого розміру.

BinaryReader — читання типізованих даних

Критично важливо: порядок читання методами (ReadInt32, ReadString тощо) повинен точно відповідати порядку запису методами Write. Якщо порядок порушений — прочитаємо «сміття» або отримаємо виняток. Бінарний формат — це неявна схема даних, яку потрібно явно документувати.

BinaryReader — методи читання

Тип C# Метод BinaryReader Розмір
bool ReadBoolean() 1 байт
byte ReadByte() 1 байт
sbyte ReadSByte() 1 байт
char ReadChar() 2 байти (Unicode)
short ReadInt16() 2 байти
ushort ReadUInt16() 2 байти
int ReadInt32() 4 байти
uint ReadUInt32() 4 байти
long ReadInt64() 8 байт
float ReadSingle() 4 байти
double ReadDouble() 8 байт
string ReadString() 7-бітна довжина + байти
byte[] ReadBytes(count) count байт

Файл з фіксованими записами — індексований доступ

Бінарні файли з фіксованим розміром запису забезпечують O(1) доступ до будь-якого елемента через Seek:

Практичний сценарій: бінарний архів ЕКГ

Реальний приклад застосування BinaryWriter/BinaryReader — зберігання даних електрокардіограми:

Структура бінарного запису фіксованого розміру

Розроблено Tomka Yurii · © 2026 ·