尝试敲定一个非常简单的Qt程序(因为我能够做到这一切!)......
...我已经将一个相当小的二进制文件读入QbyteArray,我可以看到QByteArray正确地保存了这些数据。我想将指向结构的指针转换为指向QByteArray中数据的指针,这样我就可以轻松访问文件中的数据。但是,它并没有像我期望的那样发挥作用。
例如:
struct fileHeaderStruct
{
uint16_t fileType;
uint32_t fileSize;
uint16_t reserved1;
uint16_t reserved2;
uint32_t startOffset;
};
QByteArray blob = file.readAll();
blob在其数据数组的开头包含:
42 4D 5E 04 00 00 00 00 00 00 36 04 00 00 28 00 00 00
如果我将指向fileHeaderStruct的指针转换为如下数据:
struct fileHeaderStruct* header;
header = (struct fileHeaderStruct*)blob.data();
header.fileType正确为0x4D42,但其他一切都是错误的
filesize为0,reserved1为0,reserved2为0x436,startOffset为0x280000
fileSize应该是0x45E - 它完全丢失了这两个字节并显示结构的其余部分,就好像这两个字节不存在一样。
那么,有没有人知道它为什么丢失或跳过这两个字节呢?
谢谢!
答案 0 :(得分:2)
阅读本文:http://www.catb.org/esr/structure-packing/。您的结构打包对于您拥有成员的订单是错误的。默认打包将与机器字大小对齐,在这种情况下几乎肯定是32位。 我想:
#pragma pack(16)
struct fileHeaderStruct { ...
};
#pragma pack()
应该为您提供您期望的结果,具体取决于您使用的编译器。