【Qt】使用QDataStream向QByteArray内读写数据时,输出QByteArray数据为空解决方案

原因

今天写示例时,用到使用QDataStream类向QByteArray读写数据,但打印出来为空。
下面是简化代码:

    QByteArray ba;QDataStream out(&ba, QIODevice::WriteOnly);out << "helloworld";qDebug().noquote() << "ba :" << ba.length() << ba.data();

输出如下:
在这里插入图片描述
可以看到,只输出了长度为15, 后面的数据并没有输出。并且长度好像也不对,因为即使加上\0也才11个字节。
这是为什么呢?

翻阅相关文档

查看QDataStream类
QDataStream::QDataStream(QByteArray *a, QIODevice::OpenMode mode)
解释就是:
构造在字节数组a上操作的数据流。模式描述如何使用设备。
另外,如果只想从字节数组中读取数据,也可以使用QDataStream(const QByteArray &)。
由于QByteArray不是QIODevice的子类,因此在内部创建了一个QBuffer来包装字节数组。

由以上可以得出:

因为QByteArray不是一个继承自QIODevice的类,所以QDataStream类在处理它的时候会创建一个QBuffer类.而QBuffer是继承自QIODevice类的。

但以上只是说了这样用的依据,并不能解释为什么长度会是15,而且还没有输出数据。

打印

为了验证,所以将ba进行打印。

    for (int i = 0; i < ba.length(); i++){qDebug().noquote() << i << showbase << hex << (int)ba.at(i);}

输出结果有了:
在这里插入图片描述
好像写入的数据有,但前面多了四个字节的样子。

继续查看QDataStream文档,看下以下信息:

To take one example, a char * string is written as a 32-bit integer
equal to the length of the string including the ‘\0’ byte, followed by
all the characters of the string including the ‘\0’ byte. When
reading a char * string, 4 bytes are read to create the 32-bit length
value, then that many characters for the char * string including the
‘\0’ terminator are read. The initial I/O device is usually set in the
constructor, but can be changed with setDevice(). If you’ve reached
the end of the data (or if there is no I/O device set) atEnd() will
return true.

说的意思呢,就是:
在使用QDataStream向一个QByteArray中写入数据时,会首先写入一个32位的整数,这个整数保存了此QByteArray的长度('\0’也算一个字符),当从这个QDataStream中读QByteArray中的一个字符串时会首读取这个字符串中一共有多少个字符,也就是开始的那4个byte,然后再读取字符串的内容。

回过来,看打印信息,第四个字节是0x0b,就是十进制的11,而helloworld字符串长度包含后面的\0就是11个字节。刚刚好。

说明信息是存在的。

结果

现在既然知道问题所在了,如果想打印输出,只需要将前面的4个字节给忽略就可以用QDebug进行输出了。
以下是完善代码:

    QByteArray ba;QDataStream out(&ba, QIODevice::WriteOnly);out << "helloworld";qDebug().noquote() << "ba :" << ba.length() << ba.data()+4;

在这里插入图片描述

结论

学而不思,不如刷抖音

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282851.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 定时删除过期文件

需求说明 每日凌晨0点定时删除/temp目录下的所有一个月未被访问的文件。 脚本实现 linux 终端输入crontab -e&#xff0c;添加定时任务脚本命令 [rootlocalhost ~]# crontab -e在文件末尾追加 0 0 * * * find /temp -atime 30 -exec rm -rf {} \;参数说明 命令格式&#…

Ubuntu-报错

Hadoop-Eclipse-java&#xff1a;耽误进度的几个报错 错误1&#xff1a;桥接模式与NAT模式相互切换后导致两种模式都不能访问互联网&#xff08;1&#xff09;具体错误&#xff1a;&#xff08;2&#xff09;错误原因&#xff1a;&#xff08;3&#xff09;解决方案&#xff1a…

2023新时代中国模特大赛总决赛在京落幕

12月16日&#xff0c;备受瞩目的2023新时代中国模特大赛圆满落幕。本次大赛旨在挖掘和培养具有新时代特色的模特人才&#xff0c;推动中国时尚产业的创新发展。 作为中国时尚界的重要赛事&#xff0c;新时代中国模特大赛吸引了来自全国各地的优秀模特选手45名参加全国总决赛。在…

力扣刷题-二叉树-二叉树左叶子之和

404 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 迭代法 迭代法理解…

【Qt5】如何用SVG文件来给应用程序设置图标

2023年12月17日&#xff0c;周日晚上 首先&#xff0c;在资源文件里面添加SVG文件 其次&#xff0c;写如下的代码 setWindowIcon(QIcon(":/icons/JuLongNotepadIcon.svg")); 最后&#xff0c;大功告成

一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下再反弹,求它在第10次落地时共经过多少米,第10次反弹多高。

代码如下: 结果为: #include<stdio.h> int main() { double x 100.0, y0.0; for (int i 1; i < 10; i) { y x; x / 2; y x; } y - x; printf("第十次落地时共经过%lf米\n第十次反弹%lf米", y, x); return 0; }

HarmonyOS应用开发者高级认证考试满分答案(100分)【全网最全-不断更新】【鸿蒙专栏-28】

系列文章&#xff1a; HarmonyOS应用开发者基础认证满分答案&#xff08;100分&#xff09; HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者高级认证满分答案&#xff08;100分&#xff09; HarmonyOS云开发基础认证满分答案&#xff08;100分&#xf…

部署智能合约以及 javascript 调用合约函数(Web3项目二实战之三)

在上一篇 智能合约是Web3项目的核心要务(Web3项目二实战之二) ,我们已然为项目编写了智能合约,在攥写完智能合约后,该项目将完成了一大部分,剩下无非就是用户界面交互的内容。 然而,在码完了智能合约代码后,起着承前启后关键性的便是,前端界面与智能合约的交互。 智能…

ripro后台登录后转圈和图标不显示的原因及解决方法

最近&#xff0c;好多小伙伴使用ripro主题的小伙伴们都发现&#xff0c;登录后台后&#xff0c;进入主题设置就转圈&#xff0c;等待老半天后好不容易显示页面了&#xff0c;却发现图标不显示了&#xff0c;都统一显示为方框。 这是因为后台的js、css这类静态资源托管用的是js…

PIG框架学习1——密码模式登录认证获取Token流程

文章目录 O、前言一、总流程概括&#xff1a;二、具体流程分析PIG提供的具体流程图&#xff1a;鉴权请求报文示例0、网关前置处理1、客户端认证处理2、正式接受登录请求3、组装认证对象4、认证管理器进行认证&#xff08;授权认证调用&#xff09;5、认证成功处理器 O、前言 对…

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ &#xff0c;本来用着openwrt也挺好&#xff0c;忍不住的虚拟机尝了尝鲜&#xff0c;发现的功能有2&#xff0c; 安全吧&a…

Vue脚手架环境搭建

一、node安装 1、下载地址&#xff1a;Node.js 2、开始安装&#xff0c;下一步 3、 可以更改安装路径 4、 默认安装&#xff0c;继续下一步 5、不勾选&#xff0c;继续下一步 6、安装完成&#xff0c;点击finish 7、测试&#xff0c;打开CMD控制台&#xff0c;输入命令&#…