там:
У меня есть объявление, как это:
typedef struct
{
quint8 mark1;
quint16 content1;
quint16 content2;
quint8 mark2;
}FrameHead;
и в функции я определил буфер и оценил его:
quint8 buf[40];
FrameHead *frame = (FrameHead *)buf;
frame->mark1 = 0x68;
frame->content1 = 0x3A;
frame->content1 = 0x3A;
frame->mark2 = 0x68;
Итак, как я и думал, первые 6 байтов ЬиЕ должно быть «68 3A 00 3A 00 68». Но на самом деле, первые 8 байтов ЬиЕ были «68 90 3A 00 3A 00 68 80». И я использовал:
qDebug() << (quint8 *)(++frame) - buf// output "8" but should be "6"
казалось бы, цифры «0x68» не были сохранены как quint8 типа но quint16 тип, чтобы сохранить согласованность с другими quint16 types.Anyone включил в себя те же проблемы и есть какие-либо предложения.
Это связано с выравниванием. 16-битные типы выровнены по 16-битным адресам. Поскольку ваш первый член использует только 8 бит, вставляется 1-байтовый отступ.
Если вы измените порядок своей структуры на
typedef struct
{
quint8 mark1;
quint8 mark2;
quint16 content1;
quint16 content2;
}FrameHead;
он будет использовать только 6 байтов, так как для выравнивания не требуется заполнение content1
,
Увидеть Структура набивки и упаковки для более подробного объяснения.
Изменить после комментария:
Так что либо вы используете #pragma pack(1)
(увидеть: http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=VS.100%29.aspx) (не уверен, что вы подразумеваете под
установить выравнивание в Qt как «#Pragma» в VC «
) или вы просто используете массив:
typedef quint[6] FrameHead;
....
FrameHead fh1 = {0x68, 0x00, 0x00, 0x00, 0x00, 0x68};
// or
FrameHead fh2;
memset( fh2, 0, sizeof(FrameHead));
fh2[0] = 0x68;
fh2[5] = 0x68;
Других решений пока нет …