Ну так про выравнивание надо помнить. Чтобы от него не зависеть,
можно данные протокола вытаскивать при помощи memcpy. Например,
"uint32_t tmp; memcpy(&tmp, unaligned_ptr, sizeof tmp);". При
этом неровный указатель нельзя объявлять как "uint32_t* ptr", зато
можно "void* ptr" или "uint8_t* ptr".