Целочисленные типы в форматах файлов - PullRequest
1 голос
/ 04 июня 2010

В настоящее время я пытаюсь узнать больше о форматах файлов.

У меня есть спецификация для формата 3D-файлов (в данном случае U3D), и я хочу попытаться реализовать это. Ничего серьезного, только для учебного эффекта.

Моя проблема начинается очень рано с типов, которые должны быть определены. Мне нужно определить разные целые числа (8-битные, 16-битные, 32-битные без знака и со знаком), а затем их необходимо преобразовать в шестнадцатеричное, прежде чем записать это в файл.

Как мне определить эти типы, поскольку я не могу просто создать I16, т.е. Другая проблема для меня - как преобразовать этот I16 в шестнадцатеричное число с 8 цифрами (т.е. 0001 0001).

Ответы [ 4 ]

2 голосов
/ 04 июня 2010

Hex это просто представление числа. Интерпретируете ли вы число как двоичное, десятичное, шестнадцатеричное, восьмеричное и т. Д., Зависит только от вас. В C ++ поддерживается десятичное, шестнадцатеричное и восьмеричное представления, но все они хранятся одинаково.

Пример:

int x = 0x1;
int y = 1;
assert(x == y);

Вероятно, формат файла требует, чтобы вы хранили файлы в обычном двоичном формате. Я не думаю, что формат файла хочет, чтобы шестнадцатеричные числа были читаемой текстовой строкой. Если это так, то вы можете использовать std :: hex, чтобы сделать преобразование для вас. (Пример: file << hex << number;)

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

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

Наименьшая адресуемая единица в C ++ - это char, что составляет 1 байт. Если вы хотите установить биты внутри этого байта, вам нужно использовать побитовые операторы, такие как & и |. Есть много руководств по побитовым операторам, поэтому я не буду вдаваться в подробности.

1 голос
/ 04 июня 2010

Если вы включите <stdint.h>, вы получите такие типы как:

uint8_t
int16_t
uint32_t
0 голосов
/ 04 июня 2010

Что касается «определения различных целых чисел (8-битных, 16-битных, 32-битных без знака и со знаком)», если вы не выбрасываете свои собственные и сопутствующие математические операции для них, вы должны придерживаться типов, предоставляемых вашей системой. Смотрите stdint.h для доступных typedefs, таких как int32_t.

0 голосов
/ 04 июня 2010

Во-первых, дайте мне понять. Целые числа хранятся в виде текста в файле в шестнадцатеричном формате без префикса 0x?

Затем используйте этот синтаксис:

fprintf (fp, "% 08x", число);

Запишет 0abc1234 в файл.

...