【Qt】QByteArray详解
QByteArray 是 Qt 框架中用于处理原始字节数据的核心类,其实质可以概括为以下几点:
1. 底层数据结构
• 连续内存块:存储一段连续的字节数据(char*),类似 std::vector<char>,但针对 Qt 框架做了优化。
• 自动内存管理:内部自动分配和释放内存,无需手动管理。
• 隐式共享(写时复制):使用 Implicit Sharing 技术,多个 QByteArray 对象共享同一份数据,直到修改时才进行深拷贝,以节省内存和计算资源。
2. 核心特性
• 二进制数据支持:可存储任意二进制数据(如图片、音频、协议数据),不依赖字符编码。
• 与 C 字符串兼容:数据默认以 \0 结尾,可通过 data() 或 constData() 直接获取 const char* 指针,方便与 C 函数交互。
• 动态大小:支持动态扩容(如 append()、resize()),无需预分配固定大小。
3. 主要用途
• 网络通信:序列化/反序列化数据(如通过 QNetworkRequest 发送二进制内容)。
• 文件 I/O:读写二进制文件(如 QFile::readAll() 返回 QByteArray)。
• 编码转换:作为 QString 与编码(如 UTF-8、Latin-1)之间的桥梁(例如 QString::toUtf8() 返回 QByteArray)。
• 加密/哈希:处理加密后的二进制结果(如 QCryptographicHash 的哈希值)。
4. 与 QString 的区别
| 特性 | QByteArray | QString |
|---|---|---|
| 数据本质 | 原始字节(char) | Unicode 字符(QChar,UTF-16) |
| 编码感知 | 无(直接处理字节) | 有(自动处理 Unicode 转换) |
| 适用场景 | 二进制数据、协议、文件 | 文本处理、用户界面显示 |
| C 字符串兼容性 | 直接兼容(data()) | 需转换(toUtf8()) |
5. 关键方法示例
// 创建并初始化
QByteArray data("Hello"); // 内容: 'H' 'e' 'l' 'l' 'o' '\0'// 追加数据
data.append(0x41); // 追加字节 0x41(ASCII 'A')// 获取指针
const char* cstr = data.constData(); // 指向 "HelloA\0"// 转换为十六进制字符串
QByteArray hex = data.toHex(); // "48656c6c6f41"// 内存共享验证
QByteArray copy = data; // 隐式共享,不复制数据
copy[0] = 'h'; // 触发写时复制,data 和 copy 数据分离
6. 性能与注意事项
• 高效操作:避免频繁调用 data() 获取指针,可能导致隐式共享分离。
• 二进制安全:可包含 \0 字节,size() 返回实际数据长度(不包括结尾的 \0)。
• 编码转换:与 QString 互转时需明确编码(如 fromUtf8()、toLatin1())。
常用接口:
QByteArray::fromHex() 的输入参数类型是 QByteArray。
详细说明
• 函数签名:
static QByteArray QByteArray::fromHex(const QByteArray &hexEncoded);
输入必须是一个 QByteArray 对象。
• 常见用法:
• 直接传入 QByteArray:
cpp QByteArray hexData = "48656c6c6f"; // 十六进制字符串 QByteArray data = QByteArray::fromHex(hexData);
• 若使用 QString 作为输入,需先转换为 QByteArray(例如用 toLatin1() 或 toUtf8()):
cpp QString hexStr = "48656c6c6f"; QByteArray data = QByteArray::fromHex(hexStr.toLatin1());
参数要求
-
内容必须是有效的十六进制字符串:
• 仅允许字符0-9、a-f、A-F。
• 其他字符(如空格、g、x等)会被自动忽略。 -
处理奇数字符长度:
• 如果输入字符串长度为奇数,fromHex()会自动在最前面补零,使其成为偶数长度。
• 例如:输入"123"会被当作"0123"解析。
示例
// 示例1:直接使用 QByteArray
QByteArray hex1 = "31393231"; // 对应 "19121" 的十六进制
QByteArray a1 = QByteArray::fromHex(hex1);
// 结果: a1 = "19121", size = 5// 示例2:使用 QString 转换
QString hexStr2 = "31393231";
QByteArray a2 = QByteArray::fromHex(hexStr2.toUtf8());
// 结果: a2 = "19121", size = 5// 示例3:奇数字符长度
QByteArray hex3 = "abc"; // 奇数长度
QByteArray a3 = QByteArray::fromHex(hex3);
// 解析为 "0abc",结果: a3 = "\x0a\xbc"
常见错误
• 直接传递 QString:
QString hexStr = "31393231";
QByteArray data = QByteArray::fromHex(hexStr); // 错误!类型不匹配
必须先将 QString 转换为 QByteArray(例如 hexStr.toLatin1())。
• 包含非十六进制字符:
QByteArray hexData = "1g2h"; // 'g' 和 'h' 无效
QByteArray data = QByteArray::fromHex(hexData); // 自动忽略无效字符,解析为 "12"
QByteArray::fromHex() 的补零规则:
QByteArray a = QByteArray::fromHex(QString::toLatin1("19121")); 的 size 为 3。
详细步骤解析
-
输入字符串处理:
•QString::toLatin1("19121")将字符串"19121"转换为 Latin-1 编码的QByteArray,其字节内容为0x31 0x39 0x31 0x32 0x31(对应 ASCII 字符'1' '9' '1' '2' '1')。 -
fromHex()的转换规则:
•fromHex()将输入的字符串视为十六进制编码数据,每两个字符转换成一个字节。
• 若输入长度为奇数,自动在最前面补零使其成为偶数长度。
• 对于输入"19121"(长度为 5,奇数):
◦ 补零后等效于"019121"(长度为 6,偶数)。
◦ 分组为"01"、"91"、"21"。 -
转换结果:
•"01"→0x01
•"91"→0x91
•"21"→0x21
• 最终QByteArray a包含 3 字节:[0x01, 0x91, 0x21],故a.size() = 3。
验证代码
QByteArray hexData = QString::toLatin1("19121"); // 内容: "19121" (5字节)
QByteArray a = QByteArray::fromHex(hexData);
qDebug() << a.size(); // 输出: 3
qDebug() << a.toHex(); // 输出: "019121"(实际存储的字节为 0x01 0x91 0x21)
关键点
• fromHex() 的输入必须是有效的十六进制字符(0-9、a-f、A-F),其他字符会被忽略。
• 补零规则确保奇数字符串能正确解析,避免数据截断。
相关文章:
【Qt】QByteArray详解
QByteArray 是 Qt 框架中用于处理原始字节数据的核心类,其实质可以概括为以下几点: 1. 底层数据结构 • 连续内存块:存储一段连续的字节数据(char*),类似 std::vector<char>,但针对 Qt 框…...
leetcode.189.轮转数组
第一次全反转,第二次反转前k个,第三次反转后n-k个 需要注意的是向又轮转k个时,如果超出数组长度,要对其进行取模运算才是正确的向右轮转个数 class Solution { private:void rotate(vector<int>& nums,int start,int …...
OCR 识别案例
OCR 识别案例 注意点:输入图像尺寸比例尽量和参与模型训练的数据集比例相似,识别效果会更好。 1、pytesseract Pytesseract是一个Python的光学字符识别(OCR)工具,它作为Tesseract OCR引擎的封装,允许你在…...
微信 MMTLS 协议详解(五):加密实现
常用的解密算法,对称非对称 加密,密钥协商, 带消息认证的加解密 #生成RSA 密钥对 void GenerateRsaKeypair(std::string& public_key,std::string& private_key) {RSA* rsa RSA_new();BIGNUM* bn BN_new();// 生成 RSA 密钥对BN_s…...
Mybatis配置文件解析(详细)
引言 在了解Mybatis如何帮助客户进行数据的存取后,便对Mybatis的配置文件起了兴趣,在查阅官方文档后,总结了平时能用到的配置,希望能对大家有帮助 1.核心配置文件 主要是指Mybatis-config.xml中 其包含了会深深影响Mybatis行为…...
有额外限制的 bellman_ford 算法
题目链接 1.有限制的 B e l l m a n _ F o r d Bellman\_Ford Bellman_Ford 时间复杂度: O ( N ∗ M ) O(N*M) O(N∗M) 在传统的 B e l l m a n _ F o r d Bellman\_Ford Bellman_Ford 中,可以处理边数不大于 K K K 条边的最短距离 但我们只要加一条限制(实际…...
深度剖析 Spring 源码 性能优化:核心原理与最佳实践
深度剖析 Spring 源码 & 性能优化:核心原理与最佳实践 🚀 Spring 框架 作为 Java 生态的核心技术,广泛应用于企业级开发。但很多开发者只会“用”Spring,而不深入其内部原理,导致无法高效排查问题 & 进行性能优…...
【BFS】《单源、多源 BFS:图搜索算法的双生力量》
文章目录 前言单源BFS例题一、迷宫中离入口最近的出口二、 最小基因变化三、单词接龙四、为高尔夫比赛砍树 多源BFS例题一、 01 矩阵二、飞地的数量三、地图中的最高点四、地图分析 结语 前言 什么是单源、多源BFS算法问题呢? BFS(Breadth - First Sear…...
【2025】基于springboot+vue的医院在线问诊系统设计与实现(源码、万字文档、图文修改、调试答疑)
基于Spring Boot Vue的医院在线问诊系统设计与实现功能结构图如下: 课题背景 随着互联网技术的飞速发展和人们生活水平的不断提高,传统医疗模式面临着诸多挑战,如患者就医排队时间长、医疗资源分配不均、医生工作压力大等。同时,…...
【前端】原生项目与框架项目区别
不定期更新,建议关注收藏点赞。 使用 HTML CSS JS 和 Vue 或 React 开发的项目各有其优势与不足,适用于不同的场景。目前基本上都采用框架, 总结 何时选择 HTML CSS JS: 适用于 小型项目、简单静态页面、不需要复杂交互 或 …...
STM32基础教程——PWM驱动舵机
目录 前言 技术实现 原理图 接线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 调整PWM占空比 输出比较通道重映射 舵机角度设置 实验结果 问题记录 前言 舵机(Servo)是一种位置ÿ…...
ThreadLocal详解与高频场景实战指南
ThreadLocal详解与高频场景实战指南 1. ThreadLocal概述 ThreadLocal是Java提供的线程本地变量机制,用于实现线程级别的数据隔离。每个访问该变量的线程都会获得独立的变量副本,适用于需要避免线程间共享数据的场景。 特点: 线程封闭性&a…...
odata 搜索帮助
参考如下链接: FIORI ELement list report 细节开发,设置过滤器,搜索帮助object page跳转等_fiori element label 变量-CSDN博客 注:odata搜索帮助可以直接将值带出来,而不需要进行任何的重定义 搜索帮助metedata配置…...
RK3588开发笔记-RTL8852wifi6模块驱动编译报错解决
目录 前言 一、问题背景 二、驱动编译 总结 前言 在基于 RK3588 进行开发,使用 RTL8852 WiFi6 模块时,遇到了一个让人头疼的驱动编译报错问题:“VFs_internal_I_am_really_a_filesystem_and_am_NoT_a_driver, but does”。经过一番摸索和尝试,最终成功解决了这个问题,在…...
Docker基本命令VS Code远程连接
Docker基本命令 创建自己的docker容器:docker run --net host --name Container_name --gpus all --shm-size 1t -it -v Your_Path:Your_Dir mllm:mac /bin/bashdocker run:用于创建并启动一个新容器-name:为当前新建的容器命名-gpus&#x…...
第二天 开始Unity Shader的学习之旅之熟悉顶点着色器和片元着色器
Shader初学者的学习笔记 第二天 开始Unity Shader的学习之旅之熟悉顶点着色器和片元着色器 文章目录 Shader初学者的学习笔记前言一、顶点/片元着色器的基本结构① Shader "Unity Shaders Book/Chapter 5/ Simple Shader"② SubShader③ CGPROGRAM和ENDCG④ 指明顶点…...
大疆上云api直播功能如何实现
概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…...
理解文字识别:一文读懂OCR商业化产品的算法逻辑
文字识别是一项“历久弥新”的技术。早在上世纪初,工程师们就开始尝试使用当时有限的硬件设备扫描并识别微缩胶片、纸张上的字符。随着时代和技术的发展,人们在日常生活中使用的电子设备不断更新换代,文字识别的需求成为一项必备的技术基础&a…...
使用 Cursor、MCP 和 Figma 实现工程化项目自动化,提升高达 200% 效率
直接上手不多说其他的! 一、准备动作 1、Cursor下载安卓 1.1访问官方网站 打开您的网络浏览器,访问 Cursor 的官方网站:https://www.cursor.com/cn 1.2开始下载: 点击"Download for free" 根据您的浏览器设置,会自…...
Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…...
PTA 1097-矩阵行平移
给定一个𝑛𝑛nn的整数矩阵。对任一给定的正整数𝑘<𝑛k<n,我们将矩阵的奇数行的元素整体向右依次平移1、……、𝑘、1、……、𝑘、……1、……、k、1、……、k、……个位置,平移…...
Notepad++ 替换 换行符 为 逗号
多行转一行,逗号分隔 SPO2025032575773 SPO2025032575772 SPO2025032575771 SPO2025032575771 SPO2025032575770为了方便快速替换,我们需要先知道这样类型的数据都存在哪些换行符。 点击【视图】-【显示符号】-【显示行尾符】 对于显示的行尾换行符【C…...
使用飞书API自动化更新共享表格数据
飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容,工作中基本…...
使用vscode搭建pywebview集成vue项目示例
文章目录 前言环境准备项目源码下载一、项目说明1 目录结构2 前端项目3 后端项目获取python安装包(选择对应版本及系统) 三、调试与生成可执行文件1 本地调试2 打包应用 四、核心代码说明1、package.json2、vite.config.ts设置3、main.py后端入口文件说明 参考文档 前言 本节我…...
蓝桥杯嵌入式十六届模拟三
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...
onedav一为导航批量自动化导入网址(完整教程)
OneNav作为一个功能强大的导航工具,支持后台管理、加密链接、浏览器书签批量导入等功能,能够帮助用户轻松打造专属的导航页面。今天,我将为大家详细介绍如何实现OneNav导航站的批量自动化导入网址。 1、建立要批量导入的表格 格局需要创建表格,表格的要求是一定要有需要,…...
Linux之编辑器vim命令
vi/vim命令: 终端下编辑文件的首选工具,号称编辑器之神 基本上分为三种模式,分别是 命令模式(command mode)>输入vi的命令和快捷键,默认打开文件的时候的模式插入模式(insert mode&#x…...
备赛蓝桥杯之第十六届模拟赛2期职业院校组第四题:地址识别
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试
基于3DGS和NeRF的三维重建技术在过去的一年中取得了快速的进步,动态模型也变得越来越普遍,然而这些模型仅限于处理原始轨迹域内的对象。 HRMAD作为一种混合方案,将传统的基于网格的动态三维神经重建和物理渲染优势结合,支持在任意…...
mac m3 pro 部署 stable diffusion webui
什么是Stable Diffusion WebUI ? Stable Diffusion WebUI 是一个基于Stable Diffusion模型开发的图形用户界面(GUI)工具。通过这个工具,我们可以很方便的基于提示词,描述一段文本来指导模型生成相应的图像。相比较通过…...
