2013-05-01 69 views
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 types.Anyone已经中遇到同样的问题,并有任何建议。

回答

1

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

如果你重新排列结构来

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

将只使用6个字节,因为没有填充需要对齐content1

有关更详细的解释,请参阅Structure padding and packing。评论后

编辑:

因此,无论您使用#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; 
+0

感谢johannes S.但我需要格式化“buf”。数据包的开始字节和结束字节应该是“0x68”,这就是为什么我将“contents1”,“contents2”插入结构的中间。现在你教会了我导致这个问题的原因应该是对齐的,有没有在VC中像“#Pragma”一样在Qt中设置对齐方式。 – wolfguolei 2013-05-01 15:11:35

+0

@wolfguolei,#pragma pack(1) – richselian 2013-05-01 15:18:27

+0

@richselian,thanks.it也在Qt工作。 – wolfguolei 2013-05-01 15:20:38