将结构转换为 QByteArray?
Posted
技术标签:
【中文标题】将结构转换为 QByteArray?【英文标题】:Cast a struct to a QByteArray? 【发布时间】:2014-07-21 18:22:31 【问题描述】:尝试编写一个非常简单的 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 - 它完全丢失了这两个字节并显示结构的其余部分,就好像这两个字节不存在一样。
那么,有谁知道为什么它丢失或跳过了这两个字节?
谢谢!
【问题讨论】:
你不需要像你一样在任何地方都包含struct
,这不是C。只需使用fileHeaderStruct* header;
而不是struct fileHeaderStruct* header;
。
你应该了解结构填充和structure alignment。
谢谢,CO。您必须在 C 中完成(至少在我使用的嵌入式环境中),因此假设您必须在 C++ 中完成!
@Joachim,我相信我在 32 位嵌入式处理器上做过同样的事情,没有出现这种问题。这是特定于在 PC 上编程的东西,还是我错认为它不是 ARM Cortex 上的问题?我去敲一个STM32上的测试程序来检查...
不同的编译器有不同的填充/对齐方式,尤其是在不同的平台上。
【参考方案1】:
阅读:http://www.catb.org/esr/structure-packing/。您的结构包装对于您拥有成员的顺序是错误的。默认包装将与机器字长对齐,在这种情况下几乎可以肯定是 32 位。 我认为:
#pragma pack(16)
struct fileHeaderStruct ...
;
#pragma pack()
应该会给您预期的结果,具体取决于您使用的编译器。
【讨论】:
__attribute__((packed));是什么伎俩。在***条目中找到它。 你使用的是什么编译器,顺便说一句? 这是 Linux 上的 gcc以上是关于将结构转换为 QByteArray?的主要内容,如果未能解决你的问题,请参考以下文章
将 Qt QByteArray 转换为 OpenCV cv::InputArray