Как структурировать заголовок двоичного файла на c?

#c #data-structures

#c #структуры данных

Вопрос:

Я создал свой собственный заголовок файла для двоичного файла, который содержит:

  • uint_8 обозначение файла[4]
  • что должно помочь идентифицировать мой файл

  • uint_8 CRLF_CR_LF[4]
  • состоящий из » r n 0x32 n» — помогает идентифицировать различные разрывы строк

  • uint_8 version_id
  • номер версии

  • uint_8 offset_to_data
  • с чего начинается первый блок данных (полезно, если заголовок увеличивается в следующей версии)

  • uint_16 header_size
  • размер заголовка

  • uint_32 CRC_checksum
  • полезно для проверки правильности или ошибочности данных

  • дополнительные поля, которые не так важны

Эта проблема позволяет ответить в основном на два вопроса:

  • Каков современный порядок этих сведений?
  • Что лучше хранить в байтовом массиве или в структуре (упаковка WRT, т.е. #pragma pack)?

Редактировать:
Данные хранятся в алфавитном порядке с небольшим окончанием.

Комментарии:

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

2. @Gerhardh спасибо за ваш комментарий, я ценю это. Вероятно, мне следует добавить, что я храню все данные в формате little-endian.

3. Можете ли вы гарантировать, что ваш код никогда не будет скомпилирован на большой конечной машине? Определение порядка байтов в файле — хорошая идея, но вам нужно убедиться, что программа находится на той же странице.

4. Это правильно. Вероятность того, что вам может понадобиться такое преобразование во время чтения ваших данных, может повлиять на ваше дизайнерское решение. Использование упакованной структуры с ее недостатками, такими как выравнивание по тексту и т.д., Становится менее заманчивым, если вам нужно перевернуть все остальные поля. Тогда вы могли бы просто прочитать каждое поле отдельно и сохранить должным образом в неупакованной структуре. Но окончательное решение основывается на мнении.

5. Мой совет — избегать struct для доступа к двоичным данным. Это может сработать, а позже прерваться на другой архитектуре или компиляторе. И проверить порядковый номер тривиально: просто посмотрите на первый байт целого числа, содержащего 1. Это будет 1 в системе с малым порядковым номером и 0 в системе с большим порядковым номером, независимо от системы.