C++/QT - 通过QByteArray将数据转换为不同的格式不同于读取结构
C++/QT - Converting data to different format via QByteArray differs from reading into struct
我正在尝试读取标头。结构如下:
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 的东西来实现更强大的序列化。
相关文章:
- 在C++中,我如何接受不同于同一行的用户输入
- int lastIndex[NO_OF_CHARS]={-1} 如何;不同于 vector<int> lastIndex(NO_OF_CHARS, -1);?
- 不同于按值传递和常量引用传递的程序集
- 非静态成员函数的 decltype 格式不正确吗?
- 为什么我的 clang 格式不支持 PPDirectiveIndentStyle 选项?
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- HTTP 响应格式不正确?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 如果有换行符,clang 格式不会附加大括号
- sizeof(enum) 可以不同于 sizeof(std::underlying_type<Enum>::
- C++ std::vector 中的外部类(定义格式不正确)
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- Clang格式不使用.clang格式的文件ubuntu(没有错误)
- 为什么参考简历的格式不正确?
- 使用 "()" 调用构造函数不同于"{}"
- 被隐式删除,因为默认定义格式不正确:
- 为什么 (int&)0 格式不正确?
- 循环的C 范围不同于常规循环
- C++/QT - 通过QByteArray将数据转换为不同的格式不同于读取结构