1

那里:我有这样的声明:

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;

所以我想,buf的前6个字节应该是“68 3A 00 3A 00 68”。但事实是,buf的前8个字节是“68 90 3A 00 3A 00 68 80”。我用的是:

qDebug() << (quint8 *)(++frame) - buf// output "8" but should be "6"

似乎数字“0x68”没有存储为quint8类型而是quint16类型以保持与其他quint16类型的一致性。任何人都遇到过同样的问题并有任何建议。

4

1 回答 1

1

这是由于对齐。16 位类型在 16 位地址上对齐。由于您的第一个成员仅使用 8 位,因此插入了 1 个字节填充。

如果您将结构重新排序为

typedef struct
{
    quint8  mark1;
    quint8  mark2;
    quint16 content1;
    quint16 content2;
}FrameHead;

它只会使用 6 个字节,因为 align 不需要填充content1

有关更详细的说明,请参阅结构填充和包装。

评论后编辑:

所以要么你使用#pragma pack(1)(见: http: //msdn.microsoft.com/en-us/library/2e70t5y1%28v=VS.100%29.aspx)(不知道你的意思

在 Qt 中设置对齐方式,如 VC 中的“#Pragma””

) 或者你只是使用一个数组:

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;
于 2013-05-01T15:01:06.547 回答