C++/QT - 通过QByteArray将数据转换为不同的格式不同于读取结构

C++/QT - Converting data to different format via QByteArray differs from reading into struct

本文关键字:格式 不同于 结构 读取 转换 QT 通过 QByteArray 数据 C++      更新时间:2023-10-16

我正在尝试读取标头。结构如下:

struct header
{
    uint32 offset;
    char identifier[4];
    uint32 unknown;
};

当我通过memcpy读取复制内存时,我可以正确输出偏移量(通常为大数字)。

当将内置函数与字节数组一起使用时,我读取整个文件,然后使用以下方法获取前四个字节:

QByteArray offset = data.left(4);

然后我验证了它是否正确复制,它确实如此。

我的问题是将这些字节转换为适当的数据类型时。我试过:

 qDebug() << "Offset1:" << offset.toUShort();
    qDebug() << "Offset2:" << offset;
    qDebug() << "Offset3:" << offset.toHex();
    qDebug() << "Offset4:" << offset.toInt();
    qDebug() << "Offset5:" << offset.toLong();
    qDebug() << "Offset6:" << offset.toUInt();
    qDebug() << "Offset7:" << offset.toULong();
    qDebug() << "Offset8:" << offset.toULongLong();
    qDebug() << "Offset9:" << offset.toULong();

它们都没有输出正确的值。另一方面,当我只是memcpy然后使用:

qDebug() << "Offset:" << header.offset;

我得到正确的值。在从字节到 uint32 的转换中我缺少什么?

它与字节序有关吗?

toInt() 等将字符串回复(如 "100")转换为整数,而不是二进制表示。要转换回二进制文件,必须强制转换它:

 const quint32 v = *reinterpret_cast<const quint32*>( offset.constData() );

请注意,由于字节序,这是脆弱的。 由于结构对齐(填充),带有结构的 memcpy 也不能安全携带。最好使用 QDataStream 或类似 Boost 序列化或 Google Protocol Buffers 的东西来实现更强大的序列化。