【问题标题】:Cast a struct to a QByteArray?将结构转换为 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上的测试程序来检查...
  • 不同的编译器有不同的填充/对齐方式,尤其是在不同的平台上。

标签: c++ qt


【解决方案1】:

阅读:http://www.catb.org/esr/structure-packing/。您的结构包装对于您拥有成员的顺序是错误的。默认包装将与机器字长对齐,在这种情况下几乎可以肯定是 32 位。 我认为:

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

};
#pragma pack() 

应该会给您预期的结果,具体取决于您使用的编译器。

【讨论】:

  • __attribute__((packed));是什么伎俩。在维基百科条目中找到它。
  • 你使用的是什么编译器,顺便说一句?
  • 这是 Linux 上的 gcc
猜你喜欢
  • 2016-11-04
  • 2020-09-18
  • 2012-02-03
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2012-07-02
  • 2015-02-05
  • 2013-02-26
相关资源
最近更新 更多