qt QDataStream详解

1. 概述

QDataStream是Qt框架中的一个核心类,主要用于处理二进制数据的序列化和反序列化。它提供了高效、跨平台的方式,将C++数据结构转化为字节流,便于在网络传输、持久化存储等场景下使用。QDataStream可以处理包括整数、浮点数、布尔值、字符串等多种数据类型,并且支持将这些数据类型以二进制形式写入到文件、套接字或其他设备中,也可以从这些设备中读取并解析二进制数据。

2. 重要方法

QDataStream类提供了一系列重要的方法,用于数据的读写和格式控制。以下是一些关键的方法:

  • 构造函数:QDataStream(QIODevice *d)将QDataStream与指定的QIODevice(如QFile、QTcpSocket等)关联起来,以便进行数据的读写操作。
  • << 运算符:用于将数据写入到数据流中。例如,stream << anInteger << aString;可以将整数和字符串写入到数据流中。
  • >> 运算符:用于从数据流中读取数据。例如,stream >> anInteger >> aString;可以从数据流中读取整数和字符串。
  • setVersion(int):设置数据流的版本,这对于跨版本兼容性非常重要。例如,stream.setVersion(QDataStream::Qt_5_15);可以设置数据流的版本为Qt 5.15。
  • setByteOrder(QDataStream::ByteOrder):设置字节序,QDataStream支持大小端转换。例如,stream.setByteOrder(QDataStream::LittleEndian);可以将字节序设置为小端模式。

此外,QDataStream还可以与QIODevice的子类(如QGzipDevice)配合使用,实现数据的压缩后再序列化。

3. 重要信号

QDataStream类本身并不直接提供信号(signals)功能,因为它是用于数据序列化和反序列化的工具类,而不是用于事件驱动的UI组件。然而,在使用QDataStream进行文件或网络通信时,可以结合QIODevice或其他相关类提供的信号来监控数据的读写状态。例如,QIODevice类提供了readyRead()、bytesWritten()等信号,可以用于监控数据的可读性和写入进度。

#include <QCoreApplication>  
#include <QFile>  
#include <QDataStream>  
#include <QDebug>  
  
struct MyData {  
    int num;  
    char ch[2];  
    bool b;  
    double d;  
    qint16 count;  
};  
  
int main(int argc, char *argv[]) {  
    QCoreApplication a(argc, argv);  
  
    // 将二进制数据写入到数据流中  
    QFile file("myFile.dat");  
    if (!file.open(QIODevice::WriteOnly)) {  
        qDebug() << file.errorString();  
        return -1;  
    }  
    QDataStream out(&file);  
    out << QString("the answer is") << (qint32)42;  
    file.flush();  
    file.close();  
  
    // 从数据流中读取二进制数据  
    if (!file.open(QIODevice::ReadOnly)) {  
        qDebug() << file.errorString();  
        return -1;  
    }  
    QDataStream in(&file);  
    QString str;  
    qint32 num;  
    in >> str >> num;  
    qDebug() << "Read from file:" << str << num;  
    file.close();  
  
    // 写入结构体  
    QFile file2("myFile2.dat");  
    if (!file2.open(QIODevice::WriteOnly)) {  
        qDebug() << file.errorString();  
        return -1;  
    }  
    MyData data;  
    data.b = true;  
    data.num = 64;  
    data.count = 16;  
    data.ch[0] = 'a';  
    data.ch[1] = 'b';  
    data.d = 3.1415926;  
    QDataStream out2(&file2);  
    out2.writeBytes((const char*)&data, sizeof(MyData));  
    file2.close();  
  
    return a.exec();  
}

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值