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