Как работать с бинарными данными для создания своего собственного формата файлов

В этой статье мы поговорим о том, как можно считывать и записывать двоичные данные. В руководстве мы будем использовать псевдокод, но вы можете писать на любом удобном языке программирования, который поддерживает базовые операции ввода/вывода.

Битовые операции

Если вы не знаете о битовых операциях, то в коде встретите непонятные символы, в частности: &, |, << и >>. Это стандартные битовые операции для работы с двоичным представлением чисел, доступные в большинстве языков программирования.

Порядок байтов и потоки

Прежде чем начать, давайте разберем два важных определения: порядок байтов (endiannes) и потоки.

Порядок байтов определяет — как это ни странно — порядок байтов (простите за тавтологию). Предположим, что у нас есть 16-битное число со значением 0x1020. В двоичном виде число может быть представлено по-разному: байт 0x20, а следом за ним байт со значением 0x10 (это обратный порядок байтов), или 0x10, после которого стоит байт 0x20 (это прямой порядок байтов).

Потоки — это подобные массивам объекты, которые содержат последовательность байтов (а в некоторых случаях бит). Двоичные данные считываются и записываются в эти потоки.

Считывание двоичных данных

Давайте начнем с определения некоторых полей. В идеале все они должны быть в секции private:

А вот так может выглядеть конструктор нашего класса:

Следующие функции будут читать из потока целые беззнаковые числа:

Эти функции будут считывать знаковые числа:

Запись двоичных данных

Как и в примере выше, начнем с определения полей нашего класса. Различий будет не много, но они все же будут. Как уже говорилось, в идеале все представленные ниже поля должны быть в секции private:

Вот так будет выглядеть конструктор класса:

Следующие функции будут записывать в поток целые беззнаковые числа:

А теперь осталось реализовать несколько функций, записывающих знаковые числа, однако можно использовать аналогичные методы, которые работают с беззнаковыми числами. Но для полноты API лучше всего определить эти методы:

Вывод

И на этом все! Теперь вы знаете, как можно осуществить чтение и запись двоичных данных.

Перевод статьи «How to Read and Write Binary Data for Your Custom File Formats»