Что ж, упаковка слишком зависима от платформы, чтобы действительно полагаться на нее.
В VS, когда вы делаете "pack (push, 1)", вы, по сути, устанавливаете заполнение на 8 битов, и, как выпила, в конечном итоге три байта (6 битов из которых заполнены).
Однако заполнение в GCC (если вы сделали это с __attribute __ ((упакованный)) или некоторым псевдонимом для него) может быть полностью отключено,Вот почему вы видите только 2 байта.
Чтобы сохранить его переносимость, почему бы вам просто не написать свою собственную небольшую процедуру сериализации?Как то так:
struct_commDataPack_request s;
short wire = s.TargetID | (s.OPCode<<6) | (s.CRC7 << 9);