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();
}
觉得有帮助的话,打赏一下呗。。