以下是我的代码:
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。
答案 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)
。实际上......有办法做到这一点。但首先您必须意识到您的代码存在潜在问题:
现在解决方案。如果要将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);
}