3.1.8.Qt容器大家族(4):QByteArray——字节数组

1.内容介绍

前几节课,我们讲解了QString,它是来存储文字的。但是呢,有时候我们要来存储一些不是文字的数据,比如说文件内容、网络数据、图片等,那么这时,QString就派不上用场了,那我们要怎么办呢?

这时,我们就要用到我们今天要讲到的QByteArray啦!它是Qt容器大家族中的老五,同样是一个常见的容器,而且它也不需要申请头文件,和老大、老二、老三、老四一样。

2.讲解QByteArray

QByteArray嘛,它其实简单来说,存的是原始字节,而QString存的就是一个一个的字符。它不管里面存的是图片还是文字,只管一个字节一个字节存着。

打个比方,QString就像是一个笔记本,上面写的是字。

而QByteArray就像是一个快递盒,它不管里面装的是什么。

我们如何创建一个QByteArray呢?首先第一种,最简单的还是字符串赋值,第二种是一个指定长度的方法, 第一个参数填一个字符串,第二个参数填限定的长度,就像是给快递盒定好了最大容量。

cpp 复制代码
QByteArray ba("World", 5);

第三种,我们可以让这个byteArray重复多个字符,第一个参数是要重复的次数,第二个是要重复的字符。

cpp 复制代码
QByteArray ba(10, 'A'); //AAAAAAAAAA

当然,QByteArray和QString一样,也有number函数,QByteArray有QString所有的填法,只不过它还多了一种填法,可以把number里面的数转成指定进制。

QByteArray也同样有toInt,但是后面我们可以填写进制。number函数可以把数字转成任意进制,toInt 也能从任意进制转回来。

cpp 复制代码
QByteArray ba1 = QByteArray::number(123); //123(10进制)
QByteArray ba2 = QByteArray::number(255, 16); //ff(16进制)
int val1 = ba1.toInt(); //123
int val2 = ba2.toInt(nullptr, 16); //255

那么QByteArray有哪些常用操作呢?其实很简单,它的操作和QString是完全一样的!所以我就不一一列举了,但是有一点要注意------QByteArray中,如果有中文,而且是UTF-8编码,那么一个中文是占3个字节的,所以如果QByteArray是一个中文字,那么length就会返回3。

对了,我告诉你们,QByteArray和QString之间是可以互相转化的!首先,我们怎么把QString转成QByteArray呢?有两种方法,第一种使用toUtf8函数,会把QString编码成Utf8编码,就会出现我上面说的中文占3个字节的情况。第二种是用toLocal8Bit函数,会把QString编码成你自己电脑的本地编码,中文一般就是1个字节了。

既然QString能转QByteArray,那么QByteArray也能转成QString!要把QByteArray转成QString,那么我们就可以用QString中的两个静态函数------fromUtf8和fromLocal8Bit,它们可以把编码好的QByteArray解码回来。

cpp 复制代码
QString str = "你好";
QByteArray ba1 = s.toUtf8();
QByteArray ba2 = s.toLocal8Bit();
QString s1 = QString::fromUtf8(ba1);
QString s2 = QString::fromLocal8Bit(ba2);

QByteArray还有一个很厉害的招数!它可以把你给他的字符串变成16进制编码,这样就可以看到这个字符串的16进制数据了!要获取这个16进制数据,我们可以用QByteArray中的toHex函数来转化,可以填写参数,也能不填,填写参数的话,填的是一个分隔符,可以让大家更清楚的看到这个16进制的每个字符。

那么既然有这种正操作,那么反操作怎么搞呢?要把16进制数据给到QByteArray,我们就要用到QByteArray的静态函数------fromHex,我们可以在里面输入16进制编码,QByteArray就能反推出原本的字符串。

cpp 复制代码
QByteArray ba = "Hello";
QString hex1 = ba.toHex(); //48656c6c6f
QString hex2 = ba.toHex(' ');//48 65 6c 6c 6f
//这里转化的编码是通过ASCII码转化成16进制的
QByteArray raw = QByteArray::fromHex(hex1); //Hello

好啦,QByteArray我们就讲到这里。我们下节课再见,拜拜!

相关推荐
上海安当技术2 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
不才不才不不才2 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
mifengxing2 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
Yolanda_20223 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习
郝学胜-神的一滴3 小时前
Qt 高级编程 037:QSS按钮样式封神指南
开发语言·c++·qt·软件工程·用户界面
DFT计算杂谈3 小时前
SCIENTIFIC REPORTS 非 van der Waals可调二维磁性材料设计平台
开发语言·php
库拉库拉里3 小时前
深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
开发语言·c#
霍霍的袁3 小时前
【C++】string类 从 入门使用 到 底层深浅拷贝模拟实现
开发语言·c++·visual studio
酷在前行3 小时前
【R绘图】Nature Communications 半眼图复刻:分布、区间与多面板排版(保姆级教程)
android·开发语言·r语言
C++、Java和Python的菜鸟3 小时前
第10章 后端Web进阶(Maven高级)
开发语言·python