Как уже упоминали другие, если ваше выравнивание компилятора не выровнено по байту, в вашей структуре, скорее всего, будут "дыры". Компилятор делает это, потому что ускоряет доступ к памяти.
Если вы используете gcc, есть атрибут «упакованный», который приведет к выравниванию структуры по байту и удалит «дыры»:
struct __attribute((__packed__)) mystruct {
uint8_t dummy1[1];
uint16_t very_important_data;
uint8_t dummy2[3];
} *mystruct = (void *) dataz;
Однако это не обязательно решит проблему. 16-битное значение может быть не таким, каким вы думаете, должно быть, в зависимости от порядкового номера вашей машины. Вам придется поменять байты в любых многобайтовых целых числах в структуре. Для этого нет общей функции, так как для этого потребовалась бы информация о компоновке структуры во время выполнения, которую C не предоставляет.
Отображение структур в двоичные данные обычно непереносимо, даже если вы прямо сейчас работаете на своем компьютере.