Похоже на ожидаемое поведение вашей структуры, поскольку вы определили, что packet_length
имеет длину 9 бит. Таким образом, младший бит его значения уже находится в пятом байте памяти. Таким образом, значение -128, которое вы видите там (поскольку старший бит 1 в знаковом символе интерпретируется как отрицательное значение), а значение 15 - это то, что осталось в 6-м байте.
Биты памяти выглядят так (в обратном порядке, т. Е. От старшего к младшему):
byte 6 | byte 5 | ...
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
packet_length | not_used | ...
Обратите также внимание, что этот подход может быть не переносимым, поскольку порядок байтов внутри многобайтовых переменных зависит от платформы (см. endianness ).
Обновление: Я не являюсь экспертом в кроссплатформенной разработке, также вы не рассказали много подробностей о структуре вашего запроса и т. Д. В любом случае, в этой ситуации я бы попытался установить поля запрашивать индивидуально, а не копировать структуру в него. Таким образом, я мог бы по крайней мере контролировать точные значения каждого отдельного поля.