将结构转换为QByteArray?

时间:2014-07-21 18:22:31

标签: c++ qt

尝试敲定一个非常简单的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 - 它完全丢失了这两个字节并显示结构的其余部分,就好像这两个字节不存在一样。

那么,有没有人知道它为什么丢失或跳过这两个字节呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

阅读本文:http://www.catb.org/esr/structure-packing/。您的结构打包对于您拥有成员的订单是错误的。默认打包将与机器字大小对齐,在这种情况下几乎肯定是32位。 我想:

#pragma pack(16)
struct fileHeaderStruct { ...

};
#pragma pack() 

应该为您提供您期望的结果,具体取决于您使用的编译器。