Целочисленные типы в форматах файлов
В настоящее время я пытаюсь узнать больше о форматах файлов.
У меня есть спецификация для формата файлов 3D (в данном случае U3D), и я хочу попробовать это реализовать. Ничего серьезного, только для учебного эффекта.
Моя проблема начинается очень рано с типов, которые должны быть определены. Я должен определить различные целые числа (8-битные, 16-битные, 32-битные без знака и со знаком), и затем их необходимо преобразовать в шестнадцатеричное, прежде чем записать это в файл.
Как мне определить эти типы, так как я не могу просто создать I16 т.е. Другая проблема для меня заключается в том, как преобразовать этот I16 в шестнадцатеричное число с 8 цифрами (т.е. 0001 0001).
4 ответа
Гекс это просто представление числа. Интерпретируете ли вы число как двоичное, десятичное, шестнадцатеричное, восьмеричное и т. Д., Зависит только от вас. В C++ поддерживается десятичное, шестнадцатеричное и восьмеричное представления, но все они хранятся одинаково.
Пример:
int x = 0x1;
int y = 1;
assert(x == y);
Вероятно, формат файла хочет, чтобы вы хранили файлы в обычном двоичном формате. Я не думаю, что формат файла хочет, чтобы шестнадцатеричные числа были читаемой текстовой строкой. Если это так, то вы можете использовать std::hex, чтобы сделать преобразование для вас. (Пример: file << hex << number;
)
Если формат файла говорит о записи в файл более 1 байта, будьте осторожны с порядком байтов вашей архитектуры. Это означает, что вы сохраняете самый старший байт многобайтового типа первым или последним.
В спецификациях формата файла очень часто показано, как двоичный файл должен выглядеть для данной части файла. Не путайте это с фактическим хранением двоичных цифр в виде строк. Точно так же они иногда дают ярлык для этого, указывая в шестнадцатеричном виде, как это должно выглядеть. Опять же, в большинстве случаев они не имеют в виду текстовые строки.
Наименьшая адресуемая единица в C++ - это char
что составляет 1 байт. Если вы хотите установить биты внутри этого байта, вам нужно использовать побитовые операторы, такие как &
а также |
, Есть много руководств по побитовым операторам, поэтому я не буду вдаваться в подробности здесь.
Если вы включите <stdint.h>
вы получите такие типы, как:
uint8_t
int16_t
uint32_t
Что касается "определения различных целых чисел (8-битных, 16-битных, 32-битных без знака и со знаком)", если вы не выбрасываете свои собственные и сопутствующие математические операции для них, вы должны придерживаться типов, предоставляемых вашей системой. Смотрите stdint.h для доступных typedefs, таких как int32_t.
Во-первых, дайте мне понять. Целые числа хранятся в виде текста в файле, в шестнадцатеричном формате, без префикса 0x?
Затем используйте этот синтаксис:
fprintf (fp, "% 08x", число);
Запишет 0abc1234 в файл.