C++/QT - 通过 QByteArray 将数据转换为不同格式不同于读入结构
Posted
技术标签:
【中文标题】C++/QT - 通过 QByteArray 将数据转换为不同格式不同于读入结构【英文标题】:C++/QT - Converting data to different format via QByteArray differs from reading into struct 【发布时间】:2013-01-21 23:45:07 【问题描述】:我正在尝试读取标题。这是结构:
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 的转换中我缺少什么?
跟字节序有关系吗?
【问题讨论】:
不需要换底座吗?bool ok; offset.toInt(&ok, 16);
这适用于“FF”,但不适用于 0xFF
【参考方案1】:
toInt() 等将字符串表示,如“100”转换为整数,而不是二进制表示。 要将二进制文件转换回来,您必须将其转换:
const quint32 v = *reinterpret_cast<const quint32*>( offset.constData() );
请注意,由于字节顺序,这很脆弱。由于结构对齐(填充),带有结构的 memcpy 也不能安全地移植。最好使用QDataStream 或Boost serialization 或Google Protocol Buffers 之类的东西来实现更健壮的序列化。
【讨论】:
以上是关于C++/QT - 通过 QByteArray 将数据转换为不同格式不同于读入结构的主要内容,如果未能解决你的问题,请参考以下文章
写了一个QT程序和一个C程序,如何把QT程序里发出的QByteArray类型数据,让C程序接收到或者是处理识别?
从QDataStream向QByteArray中写入数据时的注意点(QT)