1、前言

Qt通过QByteArray为我们提供了一个字节数组容器。QByteArray既可以用来存储原始的字节,包括'\0',也可以用来存储传统的8-bit 的以'\0'结尾的字符串。使用QByteArray比使用普通的const char*更方便。并且,在底层,它可以确保其中存储的数据以'\0'结尾,并且通过隐式共享(写时拷贝)策略减少内存的使用和不必要的数据复制。

2、QByteArry的初始化

QByteArray ba;
ba.resize(2);
ba[0] = 0x20;
ba[1] = 0x21;
QByteArray strInt("1234");

3、QByteArry的访问

访问方式共有四种:[]、data[] 和 at()、 constData[];

  • []和data[]为可读可写;
  • at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快。
QByteArray ba;ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31; //可读可写访问//可读可写访问
qDebug()<<"[]"<<ba[2];
qDebug()<<"data()"<<ba.data()[2];//仅读访问
qDebug()<<"at()"<<ba.at(2);
qDebug()<<"constData()"<<ba.constData()[2];

4、QByteArry的字节大小

QByteArray可以嵌入“\0”字节,size()函数总是返回整个数组的大小,包括嵌入的’\0’字节,但不包括QByteArray自动添加的终止’\0’.

QByteArray s;
s.resize(5);
s[0] = '1';
s[1] = '2';
s[2] = '3';
s[3] = '\0';
s[4] = 'a';
cout << s.size() << endl;  //打印大小5,但实际在内存中存储的大小为6,因为自动加了/0的特点
cout << s << endl; //屏幕打印的是:“123 a”//s.size()为5,但是字节数组在最后还会保留一个额外的’\0’字符, 以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\0’终止。

5、QByteArry的相互转换

(1). Hex转换(1个hex编码由两个字符构成)
//把Hex编码转换为char存储到QByteArray:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"
//"517420697320677265617421" 每两个字符表示一个16进制编码,如51表示"Q"//把QByteArray转为Hex编码:
QByteArray ba;
ba.resize(3);
ba[0] = 0x1;
ba[1] = 0x2;
ba[2] = 0x3;
qDebug() << ba.toHex(); //return "010203"
(2).数值转换与输出
//尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。int n = 63;qDebug()<<QByteArray::number(n);              // returns "63"
qDebug()<<QByteArray::number(n, 16);          // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"
qDebug()<<QByteArray::number(n, 2);          // returns "111111"
qDebug()<<QByteArray::number(n, 8);          // returns "77"//按照指定进制格式直接赋值,其中n可以是各类常见数值类型:
QByteArray ba;
int n = 63;ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"//把数值按指定格式和小数位转换输出,小数位四舍五入:
QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
qDebug()<<ba1;  // returns "1.235E+01"
qDebug()<<ba2;  // returns "12.346"
(3). QByteArray字符串数值转为各类数值

QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

QByteArray strInt("1234");
bool ok;qDebug() << strInt.toInt();   // return 1234
qDebug() << strInt.toInt(&ok,16);   // return 4660, 默认把1234作为0x1234,对应十进制数值为4660
QByteArray string("1234.56");bool ok1;
qDebug() << string.toInt();   // return 0, 小数均视为0
qDebug() << string.toInt(&ok1,16);   // return 0, 小数均视为0
qDebug() << string.toFloat();   // return 1234.56
qDebug() << string.toDouble();   // return 1234.56QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16);     // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10);     // return 0, ok == false, 转为十进制失败
(4). 大小写转换

QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换:

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();   // y == "qt by the qt company"
QByteArray z = x.toUpper();  // z == "QT BY THE QT COMPANY

6、QByteArry的接口函数

(1). bool QByteArray::isEmpty() const
// 如果字节数组的大小为0则返回true;否则返回false。
QByteArray().isEmpty();         // returns true
QByteArray("").isEmpty();       // returns true
QByteArray("abc").isEmpty();    // returns false
(2). bool QByteArray::isNull() const
// 如果该字节数组为null则返回true;否则返回false。
QByteArray().isNull();          // returns true
QByteArray("").isNull();        // returns false
QByteArray("abc").isNull();     // returns false

上面两个函数用于判断数组中是否有数据,空指针NULL一定为空字符串,空字符串不一定为空指针,见上述两个函数的第二个例子

(3). char *QByteArray::data()
//返回指向字节数组中存储的数据的指针。该指针可用于访问和修改组成数组的字节。具体访问字节数组中的某一个,采用ba.data()[0]–>访问第0个
QByteArray ba("Hello world");
char *data = ba.data();//返回一个指向字节数组ba的数据指针,指向第一个字符
qDebug() << ba.data();//打印整个字符
while (*data)
{cout << "[" << *data << "]" << endl;++data;
}//得到结果 [ H ] ,[ e ] ,[ l ] ,[ l ] ,[ o ], [ ], [ w ] ,[ r ] ,[ l ] ,[ d ].
(4). QByteArray &QByteArray::fill(char ch, int size = -1)
//将字节数组中的每个字节设置为字符ch。如果size与-1(默认值)不同,则字节数组将预先调整为大小。
QByteArray ba("Istambul");
ba.fill('o');
// ba == "oooooooo"
ba.fill('X', 2);
// ba == "XX"
(5). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const
//返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。
QByteArray x("sticky question");
QByteArray y("sti");x.indexOf(y);               // returns 0x.indexOf(y, 1);            // returns 10x.indexOf(y, 10);           // returns 10x.indexOf(y, 11);           // returns -1
(6). QByteArray QByteArray::number(int n, int base = 10)
//返回一个字节数组,其中包含等价于数字n到基数的字符串(默认为10)。基数可以是2到36之间的任何值。
int n = 63;
QByteArray::number(n);              // returns "63"
QByteArray::number(n, 16);          // returns "3f"
QByteArray::number(n, 16).toUpper();  // returns "3F"
//可以理解为 int 类型到QByteArray类型的转化。
(7). QByteArray &QByteArray::setNum(int n, int base = 10)
//将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。
QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"
(8). int QByteArray::size() const
//返回此字节数组中的字节数。 QByteArray ba("Hello");int n = ba.size();          // n == 5ba.data()[0];               // returns 'H'  操作某一位的方法ba.data()[4];               // returns 'o'ba.data()[5];               // returns '\0'
(9). QByteArray QByteArray::toHex() const
返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。
(10). QByteArray QByteArray::trimmed() const
// 返回一个字节数组,该数组从开始和结束处都删除了空格。
// 空格是指在C语言环境中标准c++ isspace()函数返回true的任何字符。这包括ASCII字符'\t','\n','\v','\f','\r',和' '。QByteArray ba("  lots\t of\nwhitespace\r\n ");
ba = ba.trimmed();
// ba == "lots\t of\nwhitespace";
(10). QByteArray QByteArray::simplified() const
// 返回一个字节数组,该数组从开始和结束处删除空白,并将每个内部空白序列替换为单个空格。
// 空格是指在C语言环境中标准c++ isspace()函数返回true的任何字符。这包括ASCII字符'\t','\n','\v','\f','\r',和' '。QByteArray ba("  lots\t of\nwhitespace\r\n ");
ba = ba.simplified();
// ba == "lots of whitespace";

参考资料

1:官方手册:QByteArray Class

QT之QByteArry相关推荐

  1. Qt学习笔记之QByteArry

    QByteArray类具有一个字节数组,它既可以存储原始字节(raw bytes),也可以存储传统的以"\0"结尾的8位字符串.在Qt中,使用QByteArray比使用const ...

  2. Qt中常用的QChar QByteArry QString数据类型转换方法

    一.QChar类型 转 QByteArry类型 char mybuffer[mybufferSize]; QByteArray ByteData = QByteArray(mybuffer, mybu ...

  3. Qt学习笔记之 字符串类型小结

    1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...

  4. 如何用QT做串口调试助手Qseriaport类的使用

    首先新建工程界面设计 在这里我就不做详述了,注意的一点就是接收框是QPlainTextEdit,我把我的整体放上来,有点丑,你们可以自由发挥. 在写之前我先把我创建的一些全局变量什么的写出来,免得下面 ...

  5. QT(1)- QString

    QT(1)- QString 1 简介 在Qt中表示字符串的类是QString类,它存储字符串是采用的Unicode码,编码方式是使用UTF-16来进行编码的,也就是一个字符(两个字节),一个中文汉字 ...

  6. 我的第二个imx6ULL应用《QT+485传感器采集》

    IMX6ULL+QT+485采集 演示视频: [野火linux]linux嵌入式问询485传感器 接下来记录我的第二个linux+QT的应用,其实原理很简单,打开串口,配置波特率,然后对接485传感器 ...

  7. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

  8. QT中使用rubberband橡皮筋等方法进行选中多个物体

    文章目录 功能介绍 代码介绍 myitem.h/cpp 图形项 myview.h/cpp场景 主函数 结果展示 代码下载 参考 功能介绍 点击左键.按 Shift 键可以单选,按下 Ctrl 可进行多 ...

  9. Electron、QT和JAVA PC桌面开发技术比较

    近几年PC桌面开发越来越多的被Electron,QT和Java技术占领.下面简单比较一下它们的优劣. Electron,势是开发用时快,社区轮子多,整合一下就能用.缺点是打包大,js计算弱. Java ...

最新文章

  1. 2002高教社杯---A车灯线光源的优化设计
  2. R使用dplyr包对变量、特征进行标准化(standardize)缩放操作
  3. 我爱Java系列---【 maven依赖版本冲突的解决方法】
  4. 通过xrdp远程访问ubuntu出现输入d最小化问题的处理
  5. Windows驱动开发学习笔记(六)—— Inline HOOK
  6. 带入gRPC:gRPC Streaming, Client and Server
  7. 环美亚二十年装修师傅分享,甲醛的八种来源
  8. 【VB测绘程序设计】第三章 VB结构化程序设计(顺序、选择、循环)
  9. matlab 球坐标绘图,MATLAB绘制地图
  10. HCIE-Security Day2:防火墙安全区域、安全级别的理解
  11. Grunt中批量无损压缩图片插件--grunt-sprite
  12. 学习date , clock , hwclork , cal, ls ,cd , pwd, tty, whereis , which ,stat, e
  13. 计算机wps云文档功能不见,WPS2019文档丢失怎么办 WPS2019云文档在哪
  14. ubuntu-22.04.1磁盘分区和挂载
  15. 蜻蜓FM 涉嫌诈骗投资人和广告主源代码剖析
  16. C++如何输入/输出
  17. 小白记录问题(2)——关于np.savez()与np.laod()储存与读取字典数据的问题
  18. 拥抱变化 把握未来——“移动”电商营销新时代
  19. 微信小程序仿打卡小程序
  20. php xmp,xmp可以一直开着吗

热门文章

  1. java exls_java excel类
  2. SwiftUI macOS 轻松搭建音乐Radio类App界面(教程含源码)
  3. JS获取json子项/数组的个数/长度
  4. cesium--绘制多边形polygon
  5. MATLAB——patch绘制多边形
  6. 目标检测:SSD改进之DSSD的论文详解
  7. 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
  8. Java计算机毕业设计腾讯网游辅助小助手源码+系统+数据库+lw文档
  9. 成长的烦恼:如何面对失败常态化的人生
  10. 批量安装系统工具cobbler配置