将QByteArray转换为QDataStream并保存的一些问题。请帮助我

时间:2012-03-09 13:47:55

标签: qt

以下是我的代码:

QFile f("tql.dll"); //a file to be copied
f.open(QFile::ReadOnly);
QByteArray qba = f.readAll();
f.close();
QString hexstr = qba.toHex();
qba = QByteArray::fromHex(hexstr.toLatin1()); //i try this and it dose not change the original data
QFile f2("tql3.dll");
f2.open(QIODevice::ReadWrite);
QDataStream out(&f2);
out << qba;
f2.close();
qDebug() << "done" << "\n"; //when i md5sum the tql3.dll.it is not the same as tql.dll

我用vim查看tql.dll和tql3.dll的十六进制来查找区别是什么。然后我发现tql3.dll.why顶部有“00 00 EC 00”额外?

PS:我知道将QByteArray直接保存到QFile是可以的。但我只想尝试QDataStream。

3 个答案:

答案 0 :(得分:2)

QDatastream旨在可移植地传输Qt类型,而不是纯二进制数据。

当您输出到QDataStream时,对于每个变量,都有一个包含内部数据的标题(我假设类型+长度)。

请参阅http://qt-project.org/doc/qt-4.8/QDataStream.html#details

  

写入流的每个项都以预定义的二进制文件写入   格式因项目类型而异[/ p>

答案 1 :(得分:0)

The data stream format page说明了QByteArray的存储方式:

  

如果字节数组为空:0xFFFFFFFF(quint32)
  否则:数组大小(quint32)后跟数组字节,即大小字节

您发布的那四个字节(32位)因此是字节数组的长度。

QDataStream应该用于序列化,因此我无法创建1:1文件副本。

答案 2 :(得分:0)

。实际上......有办法做到这一点。但首先您必须意识到您的代码存在潜在问题:

  1. 如果您尝试使用十六进制字符串转换为二进制数据,请执行此操作 根本不会工作!请记住,字符串实际上并不存在 表示二进制数据。例如:写入16位二进制“FF” 以二进制(使用十六进制表示法)作为FF。但STRING FF是写的 (使用相同的16位二进制格式)如46 46
  2. 使用QString :: toLatin1()将 NOT 以unicode输出文本 形成。我明白这可能不是你的目标,而是一般的 知识的缘故,字符只会转换为Latin1格式 如果它们是字符的ASCII等价物。如果你想要满满的 unicode支持你应该使用QString :: toUtf8()。
  3. 现在解决方案。如果要将QByteArray转换为QDataStream,可以将QDataStream :: writeBytes(const char * s,uint length)函数与QByteArray :: data结合使用()和QByteArray :: size()。

    在您的代码中,您希望将out << qba行替换为以下内容:

    out.writeBytes(qba.data(), qba.size());
    

    更安全的方法是使用以下代码:

    for (int i = 0; i < qba.size(); ++i)
    {
        out << (quint8)qba.at(i);
    }