将结构转换为 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?的主要内容,如果未能解决你的问题,请参考以下文章

将 QByteArray 转换为 char* 的问题

如何从 QByteArray 获取结构

从浮点数转换为 QByteArray

将 Qt QByteArray 转换为 OpenCV cv::InputArray

Qt - 将 QString 转换为 Unicode QByteArray

如何将 cv::mat 标头和数据部分转换为单个 qbytearray?