Qt基础教程值QByteArray字节容器的使用详解

0 543
索鸟 2020-12-09
需要:0索币
QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述。本文通过以下几个部分加以介绍:

1. 初始化

2. 访问与赋值

3. 添加、删除、插入与替换操作

4. 查找与比较

5. 数据转换与处理

1 初始化

2 访问与赋值

    访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:

  1. QByteArray ba;
  2. ba.resize(6);
  3. ba[0] = 0x3c;
  4. ba[1] = 0xb8;
  5. ba[2] = 0x64;
  6. ba[3] = 0x18;
  7. ba[4] = 0xca;
  8. ba.data()[5] = 0x31;
  9. qDebug()<<"[]"<<ba[2]; //[] d
  10. qDebug()<<"at()"<<ba.at(2); //at() d
  11. qDebug()<<"data()"<<ba.data()[2]; //data() d
  12. qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
  13. qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1

3 添加、删除、插入与替换操作

4 查找与比较

5 数据转换与处理

    从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

    1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

    2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

    3)转为整型、浮点型等数值类型;

    4)大小写转换;

    5)转为字符串类型;

5.1 Hex转换

    把Hex编码转换为char存储到QByteArray:

  1. QByteArray text = QByteArray::fromHex("517420697320677265617421");
  2. text.data(); // returns "Qt is great!"

    把QByteArray转为Hex编码:

  1. QByteArray ba;
  2. ba.resize(3);
  3. ba[0] = 0x30;
  4. ba[1] = 0x31;
  5. ba[2] = 0x32;
  6. qDebug() << ba.toHex(); //return "303132"

5.2 数值转换与输出

    尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

    把单个字符转为2-36进制数据格式:

  1. int n = 63;
  2. qDebug()<<QByteArray::number(n); // returns "63"
  3. qDebug()<<QByteArray::number(n, 16); // returns "3f"
  4. qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F"
  5. qDebug()<<QByteArray::number(n, 2); // returns "111111"
  6. qDebug()<<QByteArray::number(n, 8); // returns "77"

    按照指定进制格式直接复制,其中n可以是各类常见数值类型:

  1. QByteArray ba;
  2. int n = 63;
  3. ba.setNum(n); // ba == "63"
  4. ba.setNum(n, 16); // ba == "3f"

    把数值按指定格式和小数位转换输出,小数位四舍五入:

  1. QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
  2. QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
  3. qDebug()<<ba1; // returns "1.235E+01"
  4. qDebug()<<ba2; // returns "12.346"

5.3 字符串数值转为各类数值

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

  1. QByteArray strInt("1234");
  2. bool ok0;
  3. qDebug() << strInt.toInt(); // return 1234
  4. qDebug() << strInt.toInt(&ok0,16); // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
  5. QByteArray string("1234.56");
  6. bool ok1;
  7. qDebug() << string.toInt(); // return 0, 小数均视为0
  8. qDebug() << string.toInt(&ok1,16); // return 0, 小数均视为0
  9. qDebug() << string.toFloat(); // return 1234.56
  10. qDebug() << string.toDouble(); // return 1234.56
  11. QByteArray str("FF");
  12. bool ok2;
  13. qDebug() << str.toInt(&ok2, 16); // return 255, ok2 == true
  14. qDebug() << str.toInt(&ok2, 10); // return 0, ok == false, 转为十进制失败

5.4 大小写转换

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

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

5.5 与字符串互转

    QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符

    QByteArray转为QString示例:

  1. QByteArray ba("abc123");
  2. QString str = ba;
  3. //或str.prepend(ba);
  4. qDebug()<<str ;
  5. //输出:"abc123"

    QString转为QByteArray示例:

  1. QString str("abc123");
  2. QByteArray ba = str.toLatin1();
  3. qDebug()<<ba;
  4. //输出:"abc123"

原文https://blog.csdn.net/ecourse/article/details/80575691

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0