QT 之 QByteArray

2023-11-01

QByteArray类

提供一个字节数组,QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char *更方便.

除了QByteArray之外,Qt还提供了QString类来存储字符串数据。对于大多数用途,QString是您要使用的类。它存储16位Unicode字符,使您可以轻松地在应用程序中存储非ASCII /非拉丁字符。此外,QSt API在Qt API中始终使用。 
QByteArray适合的两个主要情况是当您需要存储原始二进制数据,并且当内存保护至关重要时(例如,使用嵌入式Linux的Qt)

初始化QByteArray的一种方法是const char *将其传递给其构造函数。例如,以下代码创建一个大小为5的字节数组, 
其中包含数据“Hello”:

            QByteArray ba("Hello");
  • 1

虽然size()为5,但是字节数组在最后还会保留一个额外的’\ 0’字符, 
以便如果使用一个函数来请求指向底层数据的指针(例如调用data()),那么指出的数据保证被’\ 0’终止。

另一种方法是使用resize()设置数组的大小,并初始化每个字节的数据字节.

QByteArray使用基于0的索引,就像C ++数组一样。 
要访问特定索引位置的字节,可以使用operator[] ()在非 常量字节数组上,operator 返回一个可以在赋值左侧使用的字节的引用。例如:

            QByteArray ba;
              ba.resize(5);
              ba[0] = 0x3c;
              ba[1] = 0xb8;
              ba[2] = 0x64;
              ba[3] = 0x18;
              ba[4] = 0xca;
            //对于只读访问,替代语法是使用at():
             for (int i = 0; i < ba.size(); ++i) 
             {
                if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
                    cout << "Found character in range [a-f]" << endl;
             }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

at()可以比operator []()更快,因为它不会导致深层拷贝发生。

要一次提取多个字节,请使用 left(),right() 或mid()。

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

调用resize()后,新分配的字节具有未定义的值。 要将所有字节设置为特定值,请调用fill()。

要获取指向实际字符数据的指针,请调用data()或constData()。这些函数返回一个指向数据开头的指针。 
指针保持有效,直到在QByteArray上调用了非const函数。除了从原始数据创建QByteArray之外,还保证数据以”\ 0”字节结尾。这个’\ 0’字节由QByteArray自动提供,并不会在size()中计算。

QByteArray类提供以下用于修改字节数据的基本功能:append(),prepend() ,insert(),replace()和remove()。

QByteArray x("and");
x.prepend("rock ");         // x == "rock and"  前置
x.append(" roll");          // x == "rock and roll" 附加
x.replace(5, 3, "&");       // x == "rock & roll" 替代
  • 1
  • 2
  • 3
  • 4

这个 replace() 和remove()函数,前两个参数是从其开始擦除的位置和应该被擦除的字节数。

一个常见的要求是从字节数组(’\ n’,’\ t’,’等)中删除空白字符,如果要从QByteArray两端删除空格,请使用trimmed()。 
如果要从两端移除空格并用字符数组中的单个空格替换多个连续的空格,请使用simplified()。

如果要查找QByteArray中特定字符或子字符串的所有出现,请使用indexOf()或lastIndexOf()。 
indexOf()从给定的索引位置开始搜索,lastIndexOf()向后搜索。两者返回字符或子字符串的索引位置, 
如果它们找到它; 否则返回-1 。例如,这是一个典型的循环,它查找特定子字符串的所有出现:

QByteArray ba("We must be <b>bold</b>, very <b>bold</b>");
int j = 0;
while ((j = ba.indexOf("<b>", j)) != -1) 
{
    cout << "Found <b> tag at index position " << j << endl;
    ++j;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果您只想检查QByteArray是否包含特定字符或子字符串,请使用contains()。 
如果要查找字节数组中特定字符或子字符串的次数,请使用count()。 
如果要将特定值的所有出现替换为另一个,请使用两个参数replace()重载之一。

可以使用运算符<(),运算符<=(),运算符==(),运算符>=()等重载运算符来比较QByteArray。比较完全基于字符的数值,非常快,但不是我们期望的。QString :: localeAwareCompare()是排序用户界面字符串的更好选择。

由于历史原因,QByteArray区分了一个Null byte 和 empty byte. 我们建议您始终使用isEmpty().

成员函数:

(1).

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

得到结果 [ H ] ,[ e ] ,[ l ] ,[ l ] ,[ o ], [ ], [ w ] ,[ r ] ,[ l ] ,[ d ].

(2). 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"
  • 1
  • 2
  • 3
  • 4
  • 5

(3). int QByteArray::indexOf(const QByteArray &ba, int from = 0) const

返回该字节数组中第一次出现字节数组ba的索引位置,从索引位置向前搜索。如果找不到ba,则返回-1 。

eg:

QByteArray x("sticky question");
QByteArray y("sti");
x.indexOf(y);               // returns 0
 x.indexOf(y, 1);            // returns 10
 x.indexOf(y, 10);           // returns 10
x.indexOf(y, 11);           // returns -1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(4). bool QByteArray::isEmpty() const

如果字节数组的大小为0,返回true; 否则返回false。

(5). QByteArray QByteArray::left(int len) const

返回一个包含该字节数组最左侧len个字节的字节数组,如果len大于size(),则返回整个字节数组. 
eg:

QByteArray x("Pineapple");
 QByteArray y = x.left(4); // y == "Pine"
  • 1
  • 2

(6). QByteArray QByteArray::number(int n, int base = 10)

返回一个字节数组,其中包含等价于数字n到基数的字符串(默认为10)。基数可以是2到36之间的任何值。 
eg:

int n = 63;
 QByteArray::number(n);              // returns "63"
QByteArray::number(n, 16);          // returns "3f"
QByteArray::number(n, 16).toUpper();  // returns "3F"
  • 1
  • 2
  • 3
  • 4

可以理解为 int 类型到QByteArray类型的转化。

(7). QByteArray &QByteArray::setNum(int n, int base = 10)

将字节数组设置为基数为n的打印值(默认为10)并返回对字节数组的引用。基数可以是介于2和36之间的任何值。对于非10以外的其他值,n被视为无符号整数。

eg:

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

(8). int QByteArray::size() const

返回此字节数组中的字节数。 
eg:

    QByteArray ba("Hello");
     int n = ba.size();          // n == 5
     ba.data()[0];               // returns 'H'  操作某一位的方法
  ba.data()[4];               // returns 'o'
    ba.data()[5];               // returns '\0'
  • 1
  • 2
  • 3
  • 4
  • 5

(9)

double QByteArray::toDouble(bool *ok = Q_NULLPTR) const

float QByteArray::toFloat(bool *ok = Q_NULLPTR) const

int QByteArray::toInt(bool *ok = Q_NULLPTR, int base = 10) const

返回转换为double值的字节数组。

eg:

QByteArray string("1234.56");
double a = string.toDouble();   // a == 1234.56
  • 1
  • 2

(10). QByteArray QByteArray::toHex() const

返回字节数组的十六进制编码副本。十六进制编码使用数字 0 - 9 和字母 a - f。 
See also fromHex().

(11). std::string QByteArray::toStdString() const

返回std :: string对象,带有QByteArray中包含的数据的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 之 QByteArray 的相关文章

  • 推荐系统指标——Hit Ratio(HR)

    我现在读过的文献里有两种定义 第一种 Deep Collaborative Filtering with Multi Aspect Information in Heterogeneous Networks 中提到的 原文中提到 where
  • 2023,你了解Kafka吗?深入详解

    消息队列的核心价值 解耦合 异步处理 例如电商平台 秒杀活动 一般流程会分为 1 风险控制 2 库存锁定 3 生成订单 4 短信通知 5 更新数据 通过消息系统将秒杀活动业务拆分开 将不急需处理的业务放在后面慢慢处理 流程改为 1 风险控制
  • IntelliJ IDEA在java开发工作中的使用总结(实用插件,快捷键,debug等)

    今天总结一下idea在工作中一些实用的小技巧 记得多少学多少 之后会继续更新补充 如果您有一些小技巧 插件 也欢迎在评论区中分享出来 1 插件篇 1 Alibaba java coding Guidelines 阿里代码规范 这个插件可以帮
  • MODBUS-RTU通讯协议简介

    MODBUS RTU通讯协议简介 什么是MODBUS MODBUS 是MODICON公司最先倡导的一种软的通讯规约 经过大多数公司 的实际应用 逐渐被认可 成为一种标准的通讯规约 只要按照这种规约进行 数据通讯或传输 不同的系统就可以通讯
  • plsql中函数调用java

    一 plsql中函数调用java 1 在plsql中先写一个函数 create or replace function test create id return number is language java name Generator
  • 机器学习之集成学习算法

    一 集成学习算法简介 1 1 什么是集成学习 集成学习通过建立几个模型来解决单一预测问题 它的工作原理是生成多个分类器 模型 各自独立地学习和作出预测 这些预测最后结合成组合预测 因此优于任何一个单分类的做出预测 1 2 复习 机器学习的两
  • JQUERY点击滚动到锚点

    document ready function a topLink click function html body animate scrollTop this attr href offset top px duration 500 e
  • jwt安全问题

    文章目录 jwt安全问题 jwt简介 jwt组成 header payload signature 潜在漏洞 空加密算法 web346 密钥爆破 web348 敏感信息泄露 web349 修改算法RS256为HS256 web350 jwt
  • Java String的split方法总结

    String的split 方法用于按传入的字符或字符串对String进行拆分 返回拆分之后的数组 1 一般用法 用一般的字符 例如 或 等符号做分隔符时 String address 上海 上海市 闵行区 吴中路 String splitA
  • 为分布式做准备吧——从Ajax到WebSocket

    文章目录 解决方案1 频繁轮询 解决方案2 长轮询 解决方案3 分块编码 解决方案4 Applet和Adobe Flash WebSocket 当需要前端频繁的请求后端数据的时候 比如说数据的实时显示 这种情况下产生问题的核心原因是 服务器
  • 前端性能测试工具Lighthouse

    在前端开发中 对于自己开发的app或者web page性能的好坏 一直是让前端开发很在意的话题 我们需要专业的网站测试工具 让我们知道自己的网页还有哪些需要更为优化的方面 现在推荐一款工具 Lighthouse 可以分析web应用程序和we
  • 三位数除以两位数竖式计算没有余数_四年级上册数学第六单元知识梳理,附一两位数除多位数计算...

    四年级上册第六单元知识梳理 复习 一位数除多位数 1 相同数位对齐 从最高位除起 除到哪一位就把商写在那一位的上面 如果被除数最高位比除数小就要看被除数的前两位 除到哪一位就把商写在那一位的上面 每次除得的余数必须比除数小 2 0除以任何不
  • OLED显示小数

    OLED显示小数并不是很难的 在通用的OLED库中是没有显示小数的 需要自己去写 写的方法大致是这样的 写出0到9的ACSLL值 只需要将小数点后面的位数 一位一位的写数字对应的ACSLL值即可 其中小数点 也是写同样对应的ACSLL值 只
  • 基于Matlab的拉普拉斯滤波图像增强

    基于Matlab的拉普拉斯滤波图像增强 图像增强是数字图像处理中一项非常重要的任务 旨在提高图像的观感或可用性 而拉普拉斯滤波是图像增强中的一种方法 通过对图像进行滤波以减少噪声和增加图像的对比度和清晰度 本文将介绍如何使用Matlab实现
  • 玩转Openwrt(一) — 刷入带ADSL驱动的全功能版本

    之前家里用的一直USR9108加上自己编译修改的内核及软件配合自己整的VIA小板子动物机 可是编译移植那真是叫一个痛苦 各种补丁各种依赖关系 实在头大 费时费力 而且还有那个悲催的USB1 1 那速度真叫认抓狂 我的移动硬盘插上基本就是个摆
  • 如何对jar包进行安全扫呢,用dependency-check工具吧

    工具下载地址 https github com jeremylong DependencyCheck 点击Releases 下载 https owasp org www project dependency check 点击Command
  • 【Ansible故障解决】使用Ansible连接被控端SSH拒绝解决办法

    Ansible故障解决 使用Ansible连接被控端SSH拒绝解决办法 一 Ansible连通性检查 二 手动SSH登录 三 检查被控端sshd conf 四 检查被控端ssh服务启用 五 检查相关文件目录权限 六 检查被控端公私钥是否正常
  • 用tensorflow实现简单的全连接层网络

    参考网上给的例程使用tensorflow实现了一个简单的全连接层网络的搭建 训练一个神经网络匹配二元函数 步骤主要如下 导入相应的包 定义添加层 准备训练数据 构建神经网络层 定义损失函数和训练优化使损失函数最小化 初始化变量 激活结构 迭
  • 2021-06-15

    安装SLAM中的一个小环节 我出现的错误 即安装Pangolin步骤 安装Pangolin 建议源码安装 安装依赖项 sudo apt get install libglew dev sudo apt get install libboos
  • 软件需求测试管理体系,软件测试管理系统的设计与实现

    毛知钢 王浩宇 刘鸿飞 摘要 为适应实验室管理的信息化需求 该文设计与实现了软件测试流程管控信息化平台 并给出了平台实际使用时的范例 结果表明 软件测试流程管控信息化平台很好地实现了软件测试工作流程化 规范化 精细化管理 为企业产品软件的高

随机推荐

  • 1. 嵌套路由

    当某个显示在
  • 【c语言pat】

    1 实验7 1 11 求整数序列中出现次数最多的数 15 分 本题要求统计一个整型序列中出现次数最多的整数及其出现次数 输入格式 输入在一行中给出序列中整数个数N 0
  • linux非root用户从源码编译安装ffmpeg及添加h264(AVC)和265(HEVC)支持

    目录 前言 安装步骤 yasm nasm x264 x265 ffmpeg 遇到的问题及解决办法 前言 当linux用户没有root权限时 可通过源码编译安装ffmpeg等工具 通过手动设置安装路径实现安装到用户指定目录下 然而ffmpeg
  • Linux入门,Linux入门教程:Linux文件管理

    一 文件命名规则 1 可以使用哪些字符 除了字符 之外 所有的字符都可以使用 但是要注意 在目录名或文件名中 不建议使用某些特殊字符 例如 lt gt 等 尽量避免使用 如果一个文件名中包含了特殊字符 例如空格 那么在访问这个文件时就需要使
  • 一边是计算机就业哀鸿遍野,一边是高考生疯狂涌向计算机专业,太魔幻了!

    前言 在张雪峰推荐的几大专业里 计算机专业是其中之一 近几年 计算机专业报考热度不减 但就业前景却令人堪忧 互联网裁员接二连三 许多码农找不到工作 一位网友感叹 一边是计算机就业哀鸿遍野 一边是高考生疯狂涌向计算机专业 太魔幻了 有人说 大
  • Github +Hexo搭建静态网页 hex d 不显示 --已解决

    教程 在进行hexo d时 发现我的主页面并没有显示 困扰两个晚上 特此记录 解决方法 打开github页面仓库 进入settings界面 点击Pages gt Visit site 就能正常显示了 也可尝试F12关闭缓存 推测是缓存问题
  • 修改el-checkbox选项框默认颜色

    模板 span i class el icon warning i span
  • flask第二个项目实战:类似于论坛平台的实现

    1 搭建项目 1 创建一个虚拟环境 2 将框架搭建出来 前后端该有的文件夹创建出来 3 定义模型 并且映射到数据库 要完成基础代码才可以映射到数据中 先初始化python manage py db init 在映射到数据库python ma
  • 阿里云服务器ecs配置之安装nginx

    一 简介 Nginx是一款轻量级的网页服务器 反向代理服务器 相较于Apache lighttpd具有占有内存少 稳定性高等优势 它最常的用途是提供反向代理服务 二 安装 1 准备工作 Nginx的安装依赖于以下三个包 意思就是在安装Ngi
  • JavaScript中的事件捕获(event capturing)和事件冒泡(event bubbling)

    聚沙成塔 每天进步一点点 专栏简介 事件捕获和事件冒泡 事件捕获 Event Capturing 示例 事件冒泡 Event Bubbling 示例 应用场景 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧
  • 华为OD机试 - 求最小步数(Java)

    题目描述 求从坐标零点到坐标点n的最小步数 一次只能沿横坐标轴向左或向右移动 2 或 3 注意 途径的坐标点可以为负数 输入描述 坐标点n 输出描述 输出从坐标零点移动到坐标点n的最小步数 备注 1 lt n lt 10 9 用例 输入 4
  • Color the ball

    点击打开链接 Problem Description N个气球排成一排 从左到右依次编号为1 2 3 N 每次给定2个整数a b a lt b lele便为骑上他的 小飞鸽 牌电动车从气球a开始到气球b依次给每个气球涂一次颜色 但是N次以后
  • Java内存分析

    程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈 2 堆区 heap 一般由程序员分配释放 若程序员不释放 程序
  • 若依前端不分离-代码生成

    1 添加菜单 刷新网页后新建的菜单栏就会出现左侧 2 创建数据库表 需要注意的是 表要创建在工程引用的数据库中 另须注意 给重要的字段添加注释 参考后面第11条 3 在若依界面中导入表结构 4 首先点击编辑 将必须填写的选项补充完整 然后点
  • Android平台上最好的几款免费代码编辑器

    概述 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 这里介绍了在Android平台上5款最好的代码编辑器 帮助你作出选择 使用正确的开发工具能够快速有效地完成源代码的编写和测试 使编程事半功倍 在网络信息高速发展的
  • 20230703

  • Linux 小插件 lrzsz epel-release

    装lrzsz的作用 就可以直接把windows上面想要装到linux上的东西直接拖拽就可以了 命令 sudo yum install lrzsz 解释 rz 是 receive zmodem 的缩写 中文含义为 接收ZMODEM 这里的接受
  • Python二级(13)——Python第三方库纵览

    一 知识导图 二 网络爬虫方向 1 网络爬虫是自动进行HTTP访问并捕获HTML页 面的程序 Python语言提供了多个具备网络爬 虫功能的第三方库 这里 仅介绍2个常用的 Python网络爬虫库 r e q u
  • JavaWeb学习笔记 day01 HTML 和 CSS

    文章目录 JavaWeb学习笔记 day01 HTML 和 CSS 1 任务 2 课堂笔记 2 1 B S 软件的结构 2 2 前端的开发流程 2 3 网页的组成部分 2 4 HTML 简介 2 5 创建 HTML 文件 2 6 HTML
  • QT 之 QByteArray

    QByteArray类 提供一个字节数组 QByteArray可用于存储原始字节 包括 0 和传统的8位 0 端接字符串 使用QByteArray比使用const char 更方便 除了QByteArray之外 Qt还提供了QString类