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我们就讲到这里。我们下节课再见,拜拜!

相关推荐
大可不必了6 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus6 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道7 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛7 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
eggwyw9 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
another heaven13 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
SomeOtherTime14 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain15 小时前
C++转Java日记(10)
java·开发语言
总要学点什么15 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
xiaoye-duck16 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型