qt5-入门-QByteArray

参考:
Using QByteArray - Qt Wiki
https://wiki.qt.io/Using_QByteArray

Qt总结之十五:QByteArray详解-CSDN博客
https://blog.csdn.net/Aidam_Bo/article/details/85778012

QT学习:09 QByteArray - schips - 博客园
https://www.cnblogs.com/schips/p/framework-cpp-qt-09-QByteArray.html

QT之QByteArry - 知乎
https://zhuanlan.zhihu.com/p/630368775

本地环境:
win10专业版,64位,Qt 5.12

代码已经测试通过。其他例子日后更新。


目录

    • 初始化
    • 申请内存
    • 访问
      • 访问单个字节
      • 截取几个字节
      • 获取指向实际数据的指针
    • 查找
    • 修改
    • 转化
    • 为什么toInt()错误

在 Qt5 中,QByteArray类型提供了一些方便的方法用于数据类型转换和处理字节数组。

  • 不包含encoding信息,也不会自动decode
  • 转化为QString时需要指明encoding,比如QString::fromUtf8()是将QByteArray转为utf8编码的QString
  • 在处理网络数据的情况下,QByteArray 类型会自动处理不同系统中的大端小端问题
  • 由于历史原因,QByteArray区分了一个Null byte 和 empty byte。建议始终使用isEmpty()

初始化

  • 使用const char*。此时会保留末尾的'\0',但是size()还是实际的字符数目5。实际上,内部是可以有'\0'的名单上末尾不行。
    QByteArray ba("Hello");
    
  • 逐个字节填充。注意:调用resize()后,新分配的字节的值是未定义的,需要设置。
    QByteArray ba;
    ba.resize(5);
    ba[0] = 0x3c;
    ...
    
  • 所有字节设置为同一个值:ba.fill(0x3c);。如果带第二个参数,就是指定填充后的长度
  • 另外一些常用的:
    • QByteArray::fromRawData(const char* data, int size):该函数将给定的字符数据和大小创建一个 QByteArray 对象。指向原始数据,no copy
    • QByteArray::fromStdString(const std::string& str):将标准 C++ 字符串转换为 QByteArray。
    • QByteArray::fromHex(const QString& hexEncoded):将十六进制字符串转换为 QByteArray。
    • QByteArray::fromBase64(const QByteArray& base64):将 Base64 编码的数据转换为 QByteArray。
  • int转化为QByteArray:第二个参数是base,默认是10,取值范围2~36。.setNum()也是类似
    int n = 63;
    QByteArray::number(n, 16).toUpper();  // returns "3F"QByteArray str("FF");
    bool ok2;
    qDebug() << str.toInt(&ok2, 10);     // return 0, ok2 == false, 转为十进制失败
    

申请内存

QByteArray可以自动调整内存大小,如果希望提高性能,则可以使用reseve()函数来主动分动一段内存空间, 如:

QByteArray byteArray;
byteArray.reserve(30); // 申请30个字节的空间

该内存空间不会主动释放,必须使用squeeze()释放:

byteArray.squeeze();   // 释放内存

访问

访问单个字节

  • 访问方式共有四种:[]data[]at()constData[],前两种可读可写,后两种只读。
  • 如果是只读访问,应该使用at()(或者 constData[]),因为at()[]快(不会导致深拷贝)。
for (int i = 0; i < ba.size(); ++i) {if (ba.at(i) >= 'a' && ba.at(i) <= 'f') {...}
}

截取几个字节

提取多个字节使用left()right()mid()(类似QString)。

获取指向实际数据的指针

使用data()constData()。指针保持有效,直到在QByteArray上调用了非const函数。

char *data = ba.data();//返回一个指向字节数组ba的数据指针,指向第一个字符
qDebug() << ba.data();//打印整个字符
while (*data)
{cout << "[" << *data << "]" << endl;++data;
}

查找

  • indexOf()lastIndexOf()。跟QString的一样,没什么好说的。
  • 判断是否包含某个子串:contains()
  • 查找并替换所有:replace()
  • 已经重载<,<=,==,>=等运算符,不常用。QString::localeAwareCompare()是排序用户界面字符串的更好选择。

修改

QByteArray x("and");
x.prepend("rock ");         // x == "rock and"  前面添加
x.append(" roll");          // x == "rock and roll" 后面添加
x.replace(5, 3, "&");       // x == "rock & roll" 替换。第二个参数是被替换的长度
x.insert(0, 'i');           // irock & roll
x.remove(0, 1);             // rock & roll

删除空白字符:

  • 空白字符指的是\n\t
  • trimmed()是去除两端的空白字符
  • simplified()除了去除两端还会将中间的多个连续空格换成单个,别的单个换成space
QByteArray x("\ta\naaa  c \n");
qDebug() << x.trimmed() << endl; // "a\naaa  c" 
qDebug() << x.simplified() << endl; // "a aaa c" 

转化

  • 转大小写:.toLower() .toUpper()
  • 转为double、float、int等:.toDouble() .toFloat() .toInt()
  • 转为16进制编码版本:.toHex()
  • 转为std::string.toStdString()

为什么toInt()错误

我有一个文档,大概内容是:
在这里插入图片描述
红线标的4个字节需要转为int,应该返回14,但是:

    QFile file("://resources/data/pUC57-Amp.dna");if (file.open(QIODevice::ReadOnly)) {QByteArray byteArray = file.readAll();file.close();// 读取一些基础信息int ptr = 0;// 读第一个字符,应该是\tQString strFirstChr = byteArray.mid(0, ptr++); // 模拟移动qDebug() << byteArray.mid(0, 1) << endl;bool isok;QByteArray a = byteArray.mid(ptr, 4);// 输出:"\x00\x00\x00\x0E" 0 falseqDebug() << a << a.toInt(&isok, 16) << isok << endl;}

修改最后一句代码:

qDebug() << a << a.toHex().toInt(&isok, 16) << isok << endl;

因为需要先转成十六进制然后再转。直接toInt(),不论是否指明base=16都不会正确转化。

qDebug() << a << a.toInt() << isok << endl;
// "\x00\x00\x00\x0E" 0 true 

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

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

相关文章

数据结构—顺序表实现通讯录

在上一节我们基本了解了顺序表的基本知识&#xff0c;接下来我们就用顺序表来实现一下通讯录。 一、基于动态顺序表实现通讯录 1.1 功能介绍 1. 能够保存用户信息&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;地址等 2. 添加联系人信息 3. …

创新营销利器:淘宝扭蛋机小程序开发全解析

在数字化浪潮的推动下&#xff0c;淘宝扭蛋机小程序的开发成为了一种全新的购物体验。它巧妙地将传统扭蛋机的乐趣与移动技术的便捷相结合&#xff0c;为用户带来了前所未有的惊喜与互动。 淘宝扭蛋机小程序的开发&#xff0c;不仅是一次技术的革新&#xff0c;更是一次购物方…

使用Python写接口压测2简单递归

递归其实在压测场景用的不多&#xff0c;但是批量造数据或批量导出&#xff0c;用的比较多&#xff0c;常见的压测登陆&#xff0c;首先你要有登陆账号的csv&#xff0c;这个时候自己可以实现一个批量获取账号的py就很惬意。 编辑器 VScode VSCode 全称 Visual Studio Code&…

基于数据库现有表导出为设计文档

1.查询 SELECTCOLUMN_NAME 字段名,COLUMN_COMMENT 字段描述,COLUMN_TYPE 字段类型,false as 是否为主键 FROMINFORMATION_SCHEMA.COLUMNS wheretable_NAME region -- 表名2.查询结果 3.导出为excel

Python学习笔记20 - 模块

什么叫模块 自定义模块 Python中的包 Python中常用的内置模块 第三方模块的安装与使用

如何提升软件发布管理过程?

大家都说&#xff0c;实践出真知。在成为一位首席技术官&#xff08;CTO&#xff09;之前&#xff0c;我也是做着跑腿活&#xff0c;我的职业生涯是从软件工程师开始的&#xff0c;后来开始管理开发和 QA 团队&#xff0c;并负责发布管理管道。我做过上百个项目&#xff0c;其中…

【第十五届】蓝桥杯省赛C++b组

今年的蓝桥杯省赛已经结束了&#xff0c;与以往不同&#xff0c;今年又回到了8道题&#xff0c;而22&#xff0c;23年出现了10道题 大家觉得难度怎么样&#xff0c;欢迎进来讨论&#xff0c;博主今年没参加哈&#xff0c;大家聊聊&#xff0c;我听听大家的意见和看法哈 试题A:…

九州金榜|孩子青春期应该如何家庭教育?

青春期&#xff0c;是一个人从儿童走向成年的重要过渡阶段&#xff0c;也是心理、生理发生巨大变化的时期。面对这一特殊时期的孩子&#xff0c;家庭教育显得尤为重要。那么&#xff0c;作为家长&#xff0c;我们该如何进行青春期孩子的家庭教育呢&#xff1f;九州金榜家庭教育…

Langchain入门到实战-第一弹

Langchain入门到实战 Langchain简介官网地址Langchain概述Langchain作用Langchain开源包使用案例更新计划 Langchain简介 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://python.langchain.com/Langchain概述 LangC…

29、链表-删除链表的倒数第N个结点

思路: 首先找到倒数第N个结点 第一种方式 先统计链表的节点数&#xff0c;然后再次遍历len-N即可得到倒数第N个结点&#xff0c;然后将前一个节点的next指针指向next的下一个节点使用快慢指针&#xff0c;快指针先跑N个结点然后慢指针开始跑&#xff0c;等快指针到达尾节点后…

Kafka 简单介绍

目录 一 消息队列&#xff08;MQ&#xff09; 1&#xff0c;为什么需要消息队列&#xff08;MQ 2&#xff0c;常见的 MQ 中间件 3&#xff0c;MQ 传统应用场景之异步处理 4&#xff0c;使用消息队列的好处 5&#xff0c;消息队列的两种模式 5.1点对点模式&#xf…

如何在Odoo 17库存中通过批次号和序列号追踪产品

在Odoo 17库存管理中&#xff0c;通过批次号和序列号追踪产品是一种确保产品从生产到销售全程可追溯的重要方式。在产品打包时或生产过程中会分配这些编号。批次号是指应用于具有相似属性的一组产品的一系列数字或代码&#xff0c;而序列号则是分配给特定单一物品的独特编号。O…

matlab使用教程(44)—绘制带标记的二维曲线图

在线图中添加标记是区分多个线条或突出显示特定数据点的有用方法。使用下面的一种方式添加标记&#xff1a; • 在线条设定输入参数&#xff08;例如 plot(x,y,-s) &#xff09;中包含标记符号。 • 将 Marker 属性指定为一个名称-值对组&#xff0c;例如 plot(x,y,Marker,s…

【干货】【常用电子元器件介绍】【晶振】--晶体振荡器/陶瓷谐振元器件的识别、检测、选用

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 一、 石英晶体振荡器 石英晶体振荡器(Quartz Crystal Oscillator)又称石英晶体谐振器,简称石英晶振或者   石英晶体振荡器是一种用于稳定频率和选择频率的电子元件,是高精度和高稳定度的…

信息系统项目管理师0051:管理基础(4信息系统管理—4.1管理方法—4.1.1管理基础)

点击查看专栏目录 文章目录 第四章 信息系统管理4.1管理方法4.1.1管理基础1.层次结构2.系统管理第四章 信息系统管理 在信息技术和数据资源要素的推动下,社会各领域已经并正在加速进入数字化的全新发展时期,基于智能、网络和大数据的新经济业态正在形成,从“数字融合”向“数…

EVenn 的维恩图综合方法(自备)

imeta最新文献&#xff1a;Visualizing set relationships: EVenns comprehensive approach to Venn diagrams 网址EVenn &#xff08;Evenn&#xff09; 提供多种在线可视化方法。 维恩图由于易于解释&#xff0c;可作为可视化集合关系的宝贵工具。广泛应用于代谢组学、基因…

SQLite超详细的编译时选项(十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件格式&#xff08;十五&#xff09; 下一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 1. 概述 对于大多数目的&#xff0c;SQLite可以使用默认的 编译选项。但是…

Python学习笔记15 - 字符串

字符串是一个不可变的字符序列&#xff0c;另一个不可变的序列是元组 字符串的驻留机制 字符串的常用操作 字符串的查询 字符串的大小写转换 字符串内容 对齐操作的方法 字符串的劈分操作 字符串的判断 字符串替换 字符串合并 字符串的比较 字符串的切片 格式化字符串 字符串…

地表蒸散发遥感产品信息提取验证与融合应用

蒸散发是陆地水循环重要变量&#xff0c;同时对农业水资源规划与管理、全球环境变化等研究异常关键。本文主要介绍常用的区域及全球蒸散发产品&#xff0c;讲解蒸散发数据产品的下载、处理、可视化、数值统计等方法&#xff1b;蒸散发产品的验证方法、精度评价、不确定性评估&a…

程序员必读:Python 中如何完美处理日志记录?

日志记录在软件开发中扮演着至关重要的角色。它不仅可以帮助开发人员跟踪应用程序的状态和行为&#xff0c;还能提供有价值的诊断信息。Python 提供了内置的 logging 模块&#xff0c;为开发者提供了一个强大且灵活的日志记录工具。 日志的重要性 在软件开发中&#xff0c;对…