Qt 将QByteArray转换为QDataStream并保存时遇到一些问题。请帮助我

Qt 将QByteArray转换为QDataStream并保存时遇到一些问题。请帮助我,qt,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 QFi

以下是我的代码:

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
QFile f(“tql.dll”)//要复制的文件
f、 打开(QFile::ReadOnly);
QByteArray qba=f.readAll();
f、 close();
QString hexstr=qba.toHex();
qba=QByteArray::fromHex(hexstr.toLatin1())//我尝试了这个,它不会改变原始数据
QFile f2(“tql3.dll”);
f2.打开(QIODevice::ReadWrite);
QDataStream out(&f2);

out
QDatastream
用于可移植地传输Qt类型,而不是普通的二进制数据

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

见:

写入流的每个项都以预定义的二进制文件写入 根据项目类型而变化的格式

.

说明如何存储
QByteArray
s:

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

因此,您发布的这四个字节(32位)就是字节数组的长度


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

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

  • 如果您试图使用十六进制字符串转换为二进制数据,则 根本不行!请记住,字符串实际上并不是 表示二进制数据。例如:写入16位二进制“FF” 二进制(使用十六进制表示法)作为FF。但是字符串FF是写的 (使用与46相同的16位二进制格式)
  • 使用QString::toLatin1()将而不是以unicode格式输出文本 形式。我知道这可能不是你在这里的目标,但总的来说 看在知识的份上,字符只能转换成拉丁文1格式 如果它们是字符的ASCII等效项。如果你想要满满的 unicode支持您应该使用QString::toUtf8()
  • 现在开始解决方案。如果要将QByteArray转换为QDataStream,可以将QDataStream::writeBytes(const char*s,uint length)函数与QByteArray::data()和QByteArray::size()结合使用


    在您的代码中,您可能希望替换出
    ,那么如何使用stream保存QByteArray?正如您所说的,只需直接保存到QFile即可。根据定义,“流”的概念是结构化数据,而不是纯二进制数据。为什么要使用流?那么如何使用流保存QByteArray?
    
    out.writeBytes(qba.data(), qba.size());
    
    for (int i = 0; i < qba.size(); ++i)
    {
        out << (quint8)qba.at(i);
    }