如何解决如何使用QDataStream从文件中读取二进制数据?
如果您查看QT的documentation。您可以使用readBytes或readRawBytes从文件中读取二进制数据。无论从文件还是流中读取数据,我都感到很舒服。 如果是readBytes-从流中读取缓冲区s,并返回对该流的引用。 如果是readRawBytes-将流中的L个(长度)字节读入s(buffer char *),并返回读取的字节数。
void readBinary(QString path)
{
QFile file(path);
if (!file.open(qiodevice::ReadOnly)) {
qDebug() << "Could not open bin file for reading";
return;
}
QDataStream in(&file);
char *data = new char[30];
qint32 bytes = in.readRawData(data,30);
//in >> data;
qInfo() << "bytes read: " << bytes;
qInfo() << data;
file.close();
}
- 我在这里想念什么?
- 我们需要对二进制数据进行序列化/反序列化吗?换句话说,对数据进行编组/取消编组。因为我已经阅读过官方文档的编码/解码,所以在读取/写入文件中的数据时,您需要自己照顾并需要设置QT版本。
- 我们如何写回文件/流。
- 如果我们还有另一种直接从文件读取/写入数据的方法。
- 我们是否需要将整个二进制数据写入缓冲区,然后再次读取?这样我们可以保持数据格式。 想要你们的一些答案!
供您参考-如下所述考虑文件中的二进制数据片段。
00000000: 0000 0520 a52a 0108 8520 0108 9320 0108 ... .*... ... ..
00000010: 9920 0108 9f20 0108 a520 0108 0000 0000 . ... ... ......
我在StackOverflow上用来解决此问题的链接是-Link1,Link2,Link3,Link4
解决方法
- 我在这里想念什么?
您使用的是原始指针,而不是QByteArray
。然后,您尝试将二进制数据打印为文本。
...
QDataStream in(&file);
// You can use QByteArray which was created especially ti avoid raw char pointers
QByteArray ba(30,0);
qint32 bytes = in.readRawData(ba.data(),ba.size());
qInfo() << "bytes read: " << bytes;
qInfo() << ba.toHex('\s'); // You read binary data,not a text. Do not try to print it as a text
- 我们需要对二进制数据进行序列化/反序列化吗?换句话说,对数据进行编组/取消编组。因为我已经阅读过官方文档的编码/解码,所以在读取/写入文件中的数据时,您需要自己照顾并需要设置QT版本。
一般来说,是的。无论如何,您的代码中都会有一些序列化/反序列化机制。 Qt提出了现成的机制。您可以忘记原始指针,大小,字节顺序。
如果使用当前版本,则无需设置版本 Qt,但对于您自己的自定义二进制格式,我们建议您 做;请参阅详细说明中的Versioning。
QByteArray ba;
// fill it by some data
// Write to file
QDataStream out(&file); // output file,socket,etc.
out << ba;
// Read from file
QDataStream in(&file);
in >> ba;
- 我们如何写回文件/流。
// Write to file
QDataStream out(&file); // output file,etc.
out << ba;
- 如果我们还有另一种直接从文件读取/写入数据的方法。
- 我们是否需要将整个二进制数据写入缓冲区,然后再次读取?这样我们可以保持数据格式。想要你们的一些答案!
通过QDataStream
,您可以直接读取/写入所需的数据结构,例如:
struct MyStruct
{
double d;
int a;
QString str;
QPixmap pix;
QVector<int> vec;
//overload the operators
friend QDataStream &operator << (QDataStream &out,const MyStruct &d)
{
out << d.d << d.a << d.str << d.pix << d.vec;
return out;
}
friend QDataStream &operator >> (QDataStream &in,MyStruct &d)
{
in >> d.d >> d.a >> d.str >> d.pix >> d.vec;
return in;
}
}
// Now you can:
MyStruct data;
out << data;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。