uint8_t payload[0];
Это действительно указатель (как в вашем delphi-коде) или массив на месте размером 0, используемый для представления данных, следующих за заголовком
И вы должны пометить свои записи как packed
. Не думаю, что это имеет значение в вашем конкретном коде, но это хорошая практика, поскольку правила упаковки легко ошибиться, могут измениться, и не все их знают.
Это, вероятно, имеет значение, потому что package_hdr составляет 7 байт при упаковке, поэтому следующий пакет_hw начинается со смещения 7 при упаковке и, вероятно, с 8 при выравнивании.