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