微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用QDataStream从文件中读取二进制数据?

如何解决如何使用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();
}

不显示读取的字节数,但不显示屏幕上的二进制数据。

  1. 在这里想念什么?
  2. 我们需要对二进制数据进行序列化/反序列化吗?换句话说,对数据进行编组/取消编组。因为我已经阅读过官方文档的编码/解码,所以在读取/写入文件中的数据时,您需要自己照顾并需要设置QT版本。
  3. 我们如何写回文件/流。
  4. 如果我们还有另一种直接从文件读取/写入数据的方法
  5. 我们是否需要将整个二进制数据写入缓冲区,然后再次读取?这样我们可以保持数据格式。 想要你们的一些答案!

供您参考-如下所述考虑文件中的二进制数据片段。

00000000: 0000 0520 a52a 0108 8520 0108 9320 0108  ... .*... ... ..
00000010: 9920 0108 9f20 0108 a520 0108 0000 0000  . ... ... ......

我在StackOverflow上用来解决此问题的链接是-Link1Link2Link3Link4

解决方法

  1. 我在这里想念什么?

您使用的是原始指针,而不是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
  1. 我们需要对二进制数据进行序列化/反序列化吗?换句话说,对数据进行编组/取消编组。因为我已经阅读过官方文档的编码/解码,所以在读取/写入文件中的数据时,您需要自己照顾并需要设置QT版本。

一般来说,是的。无论如何,您的代码中都会有一些序列化/反序列化机制。 Qt提出了现成的机制。您可以忘记原始指针,大小,字节顺序。

From the docs:

如果使用当前版本,则无需设置版本 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;
  1. 我们如何写回文件/流。
// Write to file
QDataStream out(&file); // output file,etc.
out << ba;
  1. 如果我们还有另一种直接从文件读取/写入数据的方法。
  2. 我们是否需要将整个二进制数据写入缓冲区,然后再次读取?这样我们可以保持数据格式。想要你们的一些答案!

通过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 举报,一经查实,本站将立刻删除。