以下是我的代码:
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的十六进制,找出is.Then发现tql3.dll.why顶部有"00 EC 00“的差异吗?
PS:我知道把QByteArray保存到QFile direct.but是可以的,我只想试试QDataStream。
发布于 2012-03-09 14:10:10
QDatastream
用于可移植地流Qt类型,而不是普通的二进制数据。
当您输出到QDataStream时,每个变量都有一个包含内部数据的头(我假设类型为+ length)。
请参阅http://qt-project.org/doc/qt-4.8/QDataStream.html#details
写入流的每一项都是以预定义的二进制格式编写的,这种格式根据项的类型而有所不同
。
发布于 2012-03-09 15:24:56
数据流格式页说明了QByteArray
的存储方式:
如果字节数组为null: 0xFFFFFFFF (quint32) 否则:数组大小(quint32)后面跟着数组字节,即大小字节。
您提交的这四个字节(32位)就是字节数组的长度。
QDataStream
应该用于序列化,因此我无法创建1:1的文件副本。
发布于 2014-09-21 03:40:13
.Actually...有办法做到这一点。但首先,您必须意识到代码存在潜在的问题:
如果您想将一个转换为一个QDataStream,那么可以使用QDataStream::writeBytes(const *s,uint )函数和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);
}
https://stackoverflow.com/questions/9635072
复制相似问题