Приведение указателя для повторного использования буфера

там:
У меня есть объявление, как это:

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 включил в себя те же проблемы и есть какие-либо предложения.

1

Решение

Это связано с выравниванием. 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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]