Вы не должны использовать встроенные типы для сериализации;вместо этого, когда вам нужно знать точный размер типа, вам нужны типы с фиксированной шириной:
#include <stdint.h>
unsigned char buf[8]; // 64-bit raw data
uint64_t little_endian_value =
(uint64_t)buf[0] + ((uint64_t)buf[1] << 8) + ((uint64_t)buf[2] << 16) + ... + ((uint64_t)buf[7] << 56);
uint64_t big_endian_value =
(uint64_t)buf[7] + ((uint64_t)buf[6] << 8) + ((uint64_t)buf[5] << 16) + ... + ((uint64_t)buf[0] << 56);
Аналогично для 32-битных значений используйте uint32_t
там.Убедитесь, что ваш исходный буфер использует без знака символов.