#include <stdint.h>
union header {
uint8_t a[8];
uint64_t u;
};
const struct header h = { .u = (sizeof( short ) << 0 )
| (sizeof( int ) << 8 )
| (sizeof( long ) << 16 )
| (sizeof( long long ) << 24 )
| (sizeof( float ) << 32 )
| (sizeof( double ) << 40 )
| (sizeof( long double ) << 48 )
| 0 } ;
Этого должно быть достаточно, чтобы проверить размеры типов и порядковый номер, за исключением того, что числа с плавающей запятой для этого невероятно сложны.
Если вы хотите убедиться, что ваши числа с плавающей запятой хранятся в одном и том жеотформатируйте на устройстве записи и чтения, тогда вы можете захотеть сохранить пару постоянных чисел с плавающей запятой (более интересных, чем 0, 1 и -1) в различных размерах после этого заголовка и убедиться, что они соответствуют вашим ожиданиям.be.
Весьма вероятно, что сохранение действительной магической строки с номером версии также будет полезно в качестве еще одной проверки, что это правильный формат файла.
Если вас не волнует floatили что-то в этом роде, тогда не стесняйтесь удалять их.Я не включил символ, потому что он должен быть всегда 1 байтом.
Это может быть хорошей идеей, если вы также сохраните размер некоторой структуры, такой как:
struct misalligned {
char c;
uint64_t u;
};
Это должно позволитьВы можете легко определить выравнивание и заполнение компилятора, который сгенерировал код, сгенерировавший файл.Если бы это было сделано на большинстве 32-битных компьютеров, которые заботятся о выравнивании, размер был бы 96, потому что между c и u было бы 3 байта заполнения, но если бы это было сделано на 64-битной машине, то его размер мог бы быть 128, имея7 байтов заполнения между c и u.Если бы это было сделано на AVR, размер этого, скорее всего, был бы 9, потому что там не было бы заполнения.
NOTE
- этот ответ основывался на вопросе о том, что файлы былипамять сопоставлена и нет необходимости в переносимости, за исключением того, что файл был неверного формата.Если бы вопрос касался общего хранения файлов и повторной проверки, я бы ответил по-другому.Самым большим отличием будет упаковка структур данных.