数据流是编码信息的二进制流,它与主机计算机的操作系统,CPU或字节顺序无关。 例如,运行Windows的Sun SPARC可以读取Windows下PC写入的数据流。

您还可以使用数据流来读取/写入未编码的原始二进制数据。 如果要“解析”输入流,请参见QTextStream。

QDataStream类实现C ++基本数据类型的序列化,例如char,short,int,char *等。更复杂的数据的序列化是通过将数据分解为基本单元来实现的。

数据流与QIODevice紧密协作。 QIODevice表示一种输入/输出介质,可以从中读取数据或将数据写入其中。 QFile类是I/O设备的示例。
示例(将二进制数据写入流):

QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);   // we will serialize the data into the file
out << QString("the answer is");   // serialize a string
out << (qint32)42;        // serialize an integer

示例(从流中读取二进制数据):

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;           // extract "the answer is" and 42

写入流的每个项目均以预定义的二进制格式写入,该格式根据项目的类型而有所不同。支持的Qt类型包括QBrush,QColor,QDateTime,QFont,QPixmap,QString,QVariant等。有关支持数据流的所有Qt类型的完整列表,请参见序列化Qt数据类型。

对于整数,最好始终将其转换为Qt整数类型进行写入,然后再读回相同的Qt整数类型。这样可以确保获得所需大小的整数,并使您与编译器和平台的差异隔离。

枚举可以通过QDataStream进行序列化,而无需手动定义流运算符。枚举类使用声明的大小进行序列化。
举一个例子,一个char *字符串被写为一个32位整数,该整数等于包括'\0'字节的字符串的长度,其后是包括'\0'字节的字符串的所有字符。读取char *字符串时,将读取4个字节以创建32位长度值,然后读取char *字符串的许多字符,包括'\0'终止符。

初始I/O设备通常在构造函数中设置,但可以使用setDevice()进行更改。如果到达数据末尾(或没有设置I/O设备),则atEnd()将返回true。

版本控制

QDataStream的二进制格式自Qt 1.0以来已经发展,并且可能会继续发展以反映Qt中所做的更改。 输入或输出复杂类型时,确保使用相同版本的流(version())进行读写非常重要。 如果需要向前和向后兼容性,则可以在应用程序中对版本号进行硬编码:

stream.setVersion(QDataStream::Qt_4_0);

如果要生成新的二进制数据格式,例如由应用程序创建的文档的文件格式,则可以使用QDataStream以可移植格式写入数据。 通常,您将编写一个简短的标头,其中包含一个魔术字符串和一个版本号,以便为将来的扩展留出空间。 例如:

  QFile file("file.xxx");file.open(QIODevice::WriteOnly);QDataStream out(&file);// Write a header with a "magic number" and a versionout << (quint32)0xA0B0C0D0;out << (qint32)123;out.setVersion(QDataStream::Qt_4_0);// Write the dataout << lots_of_interesting_data;

然后阅读:

  QFile file("file.xxx");file.open(QIODevice::ReadOnly);QDataStream in(&file);// Read and check the headerquint32 magic;in >> magic;if (magic != 0xA0B0C0D0)return XXX_BAD_FILE_FORMAT;// Read the versionqint32 version;in >> version;if (version < 100)return XXX_BAD_FILE_TOO_OLD;if (version > 123)return XXX_BAD_FILE_TOO_NEW;if (version <= 110)in.setVersion(QDataStream::Qt_3_2);elsein.setVersion(QDataStream::Qt_4_0);// Read the datain >> lots_of_interesting_data;if (version >= 120)in >> data_new_in_XXX_version_1_2;in >> other_interesting_data;

您可以选择序列化数据时要使用的字节顺序。默认设置为big endian(MSB在前)。将其更改为Little Endian会破坏可移植性(除非读者也更改为Little Endian)。除非您有特殊要求,否则我们建议保留此设置。

读写原始二进制数据

您可能希望直接从数据流读取/写入自己的原始二进制数据。可以使用readRawData()将数据从流中读取到预分配的char *中。同样,可以使用writeRawData()将数据写入流中。请注意,数据的任何编码/解码都必须由您完成。

一对类似的函数是readBytes()和writeBytes()。它们与原始副本不同,如下所示:readBytes()读取一个Quint32,将其作为要读取的数据的长度,然后将该字节数读取到预分配的char *中; writeBytes()写入一个quint32,其中包含数据的长度,后跟数据。请注意,数据的任何编码/解码(长度quint32除外)都必须由您完成。

读写Qt集合类

Qt容器类也可以序列化为QDataStream。这些包括QList,QLinkedList,QVector,QSet,QHash和QMap。流运算符被声明为类的非成员函数。

读写其他Qt类

除了此处记录的重载流运算符之外,您可能要序列化为QDataStream的任何Qt类都将具有适当的流运算符,这些流运算符声明为该类的非成员函数:

QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);

例如,以下是声明为QImage类的非成员的流运算符:

QDataStream & operator<< (QDataStream& stream, const QImage& image);
QDataStream & operator>> (QDataStream& stream, QImage& image);

若要查看您喜欢的Qt类是否定义了类似的流运算符,请查看该类的文档页面的“相关非成员”部分。

使用读取事务

当数据流在异步设备上运行时,数据块可能在任意时间点到达。 QDataStream类实现了一种事务处理机制,该机制提供了使用一系列流运算符自动读取数据的功能。 例如,您可以通过使用连接到readyRead()信号的槽函数中的事务来处理套接字的不完整读取:

  in.startTransaction();QString str;qint32 a;in >> str >> a; // try to read packet atomicallyif (!in.commitTransaction())return;     // wait for more data

如果没有收到完整的数据包,此代码会将流恢复到初始位置,此后您需要等待更多数据到达。

QDataStream类的官方简介相关推荐

  1. QT的QDataStream类的使用

    详细说明 QDataStream类提供二进制数据到QIODevice的序列化. 数据流是编码信息的二进制流,它与主机计算机的操作系统,CPU或字节顺序无关,均为100%. 例如,运行Windows的S ...

  2. QTextStream 类(文本流)和 QDataStream 类(数据流)

    QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: 本文福利,莬费领取Qt开发学习资料包.技术视频,内容包括(C++语言基础,Qt ...

  3. 检测、识别类算法性能指标简介

    检测.识别类算法性能指标简介 1 概念介绍 先假定一个具体场景作为例子. 假如某个班级有男生80人,女生20人,共计100人.目标是找出所有女生. 某人挑选出50个人,其中20人是女生,另外还错误的把 ...

  4. Matcher类中方法简介说明

    转自: Matcher类中方法简介说明 Matcher类中索引方法 索引方法的功能: 提供了索引信息, 返回匹配字符串的位置信息 索引方法如下所示: 编号 方法及备注说明 1 public int s ...

  5. html伪类选择器怎么使用,CSS3 :default伪类选择器使用简介

    一.CSS3 :default伪类选择器简介 CSS3 :default 伪类选择器只能作用在表单元素上,表示默认状态的表单元素. 举个例子,一个下拉框,可能有多个选项,我们默认会让某个 处于 sel ...

  6. Android4.3引入的UiAutomation新框架官方简介

    译者序:Google在Android 4.3发布时提供了一套新的UiAutomation框架来支持用户界面自动化测试,该框架通过运用已有的Accessibility APIs来模拟用户跟设备用户界面的 ...

  7. Instrumentation安卓官方简介(个人认为是HighLevel抽象出来的最简洁明了的阐述)

    官方连接:http://developer.android.com/tools/testing/testing_android.html中间Instrumentation段落 (百度出来的Instru ...

  8. Spring 官方简介【spring】

    1.Spring 1.1.简介 Spring:春天----->给软件行业带来了春天! 2002,首次推出了Spring框架的雏形:interface21框架! Spring框架即以interfa ...

  9. Java学习笔记——类集框架简介

    Java类集框架 类集指的就是一套动态对象数组的实现方案,在实际开发之中没有任何一项开发可以离开数组,但是传统的数组实现起来非常的繁琐.而且长度是其致命伤,正是因为长度的问题,传统的数组是不能大范围使 ...

最新文章

  1. java文件保存异常_Java 实现把异常信息写入到文件中
  2. 滴滴出行首次进军非洲市场,网络推广外包后的滴滴想去的国家还有很多
  3. ARP协议SMTP协议MIME
  4. 5.成本会计理论的U9系统实现(上)
  5. python空类型用什么表示_python中怎么表示空值
  6. 在学术论文投稿时你遇到过最奇葩的审稿意见是什么?
  7. docker 指定网卡_Docker | Docker技术基础梳理(五) Docker网络管理
  8. 关于Redis配置主从复制踩到的坑,主机不显示从机的连接信息
  9. Oracle→序列、视图、索引、存储过程、存储函数、包、触发器、表分区、锁表解锁表、事务、PLSQL、备份恢复、游标
  10. 给定一个字符串,求第一个不重复的字符
  11. linux ftp服务器登录异常解决
  12. 计算机专业轻薄本还是游戏本,十大精品笔记本电脑(高端轻薄本和高端游戏本)...
  13. 系统全面讲解word中选择性粘贴命令
  14. 计算机组成原理(三)存储器的层次结构
  15. 代码埋点、可视化埋点、无埋点几种数据埋点方案的分析报告
  16. 重新定义团队 谷歌的自由精神对所有公司都适用
  17. Scrapy抓站:大批量下载360指定专题下的照片并保存到sql和本地文件夹下
  18. Oracle数据库临时表-----会话级的临时表和事务级的临时表
  19. 英语:英语写作(200个单词)
  20. TI 高精度实验室《运算放大器系列--稳定性分析》

热门文章

  1. 自定义Element ui中el-upload上传后的文件图标
  2. 透明遮罩图层VS高斯模糊滤镜 效果分析
  3. 计算机语言phal语言,2.7 PhalApi 2.x 国际化
  4. WINCC的SQL应用,无需修改任何源码
  5. 计算机系统里绘图基本操作,计算机的基本操作
  6. 社交数据在征信领域的应用探索
  7. html页面设计参考文献英文,网页设计网站参考文献(国外英文资料).doc
  8. java 查看内存_java 内存查看工具
  9. 小米玩机------MIUI里那些你可能不知道的冷知识
  10. Android开发指南