【问题标题】:How to read Binary data from file using QDataStream?如何使用 QDataStream 从文件中读取二进制数据?
【发布时间】:2021-02-01 14:45:05
【问题描述】:

如果您查看 QT 的 documentation。您可以使用 readBytes 或 readRawBytes 从文件中读取二进制数据。在任何情况下我都很舒服,无论是从文件还是流中读取数据。 在 readBytes 的情况下 - 从流中读取缓冲区 s 并返回对流的引用。 如果是 readRawBytes - 从流中读取 L (length) 个字节到 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. 我们是否需要将整个二进制数据写入缓冲区然后再次读取?这样我们就可以维护数据的格式。 想从你们那里得到一些答案!

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

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

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

【问题讨论】:

  • 您将data 视为一个空终止的char 数组,它(可能)不是。尝试将数据读入QByteArray 并打印出来。
  • @G.M. readRawData 基本上将输入作为 char *。无法从 QByteArray 转换为 char *。

标签: c++ qt file c++11 qt5


【解决方案1】:
  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, socket, 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2022-01-06
    • 2015-06-27
    • 2015-04-23
    相关资源
    最近更新 更多