【发布时间】: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上的测试程序来检查...
-
不同的编译器有不同的填充/对齐方式,尤其是在不同的平台上。