QT QByteArray 的用法
QByteArray
是 Qt 中用于处理原始字节数据的类,类似于标准库中的 std::vector<char>
或 std::string
,但具有更多适合Qt框架的功能。它可以用来处理文本和二进制数据,并提供了一些方便的方法进行数据操作。下面是一些常见的用法示例:
创建和初始化
#include <QByteArray>
#include <QDebug>int main() {QByteArray byteArray1; // 创建一个空的 QByteArrayQByteArray byteArray2("Hello, World!"); // 使用字符串初始化QByteArray byteArray3(10, 'a'); // 创建一个大小为10且填充字符'a'的 QByteArrayqDebug() << "byteArray1:" << byteArray1;qDebug() << "byteArray2:" << byteArray2;qDebug() << "byteArray3:" << byteArray3;return 0;
}
访问和修改数据
#include <QByteArray>
#include <QDebug>int main() {QByteArray byteArray("Hello, World!");// 访问数据char firstChar = byteArray[0];qDebug() << "First character:" << firstChar;// 修改数据byteArray[0] = 'h';qDebug() << "Modified byteArray:" << byteArray;// 使用 append 方法byteArray.append(" Goodbye!");qDebug() << "Appended byteArray:" << byteArray;return 0;
}
转换
#include <QByteArray>
#include <QDebug>
#include <QString>int main() {QByteArray byteArray("Hello, World!");// 转换为 QStringQString str = QString::fromUtf8(byteArray);qDebug() << "QString:" << str;// 从 QString 转换为 QByteArrayQByteArray byteArrayFromString = str.toUtf8();qDebug() << "QByteArray from QString:" << byteArrayFromString;return 0;
}
查找和分割
#include <QByteArray>
#include <QDebug>int main() {QByteArray byteArray("Hello, World! Hello, Qt!");// 查找子串int index = byteArray.indexOf("Hello");qDebug() << "First occurrence of 'Hello':" << index;// 分割QList<QByteArray> parts = byteArray.split(',');for (const QByteArray &part : parts) {qDebug() << "Part:" << part;}return 0;
}
文件操作
#include <QFile>
#include <QByteArray>
#include <QDebug>int main() {QFile file("example.bin");if (file.open(QIODevice::ReadOnly)) {QByteArray fileData = file.readAll();file.close();qDebug() << "File data:" << fileData;// 对数据进行操作...// 写回文件if (file.open(QIODevice::WriteOnly)) {file.write(fileData);file.close();}} else {qDebug() << "Failed to open file.";}return 0;
}
与串口结合使用
结合前面的示例,将 QByteArray
用于串口数据传输:
#include <QApplication>
#include <QFileDialog>
#include <QFile>
#include <QSerialPort>
#include <QDebug>QByteArray createHeader(quint32 sequenceNumber) {QByteArray header;header.append("HEADER");header.append(QByteArray::number(sequenceNumber));return header;
}QByteArray createFooter() {QByteArray footer;footer.append("FOOTER");return footer;
}bool sendPacket(QSerialPort &serial, quint32 sequenceNumber, const QByteArray &data) {QByteArray packet;packet.append(createHeader(sequenceNumber));packet.append(data);packet.append(createFooter());qint64 bytesWritten = serial.write(packet);return bytesWritten == packet.size();
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QString filePath = QFileDialog::getOpenFileName(nullptr, "Open Binary File", "", "Binary Files (*.bin);;All Files (*)");if (filePath.isEmpty()) {qDebug() << "No file selected.";return -1;}QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {qDebug() << "Cannot open file for reading:" << file.errorString();return -1;}QByteArray fileData = file.readAll();file.close();QSerialPort serial;serial.setPortName("COM3");serial.setBaudRate(QSerialPort::Baud9600);serial.setDataBits(QSerialPort::Data8);serial.setParity(QSerialPort::NoParity);serial.setStopBits(QSerialPort::OneStop);serial.setFlowControl(QSerialPort::NoFlowControl);if (!serial.open(QIODevice::WriteOnly)) {qDebug() << "Cannot open serial port:" << serial.errorString();return -1;}int packetSize = 128;int totalSize = fileData.size();quint32 sequenceNumber = 0;for (int i = 0; i < totalSize; i += packetSize) {QByteArray dataChunk = fileData.mid(i, packetSize);if (!sendPacket(serial, sequenceNumber++, dataChunk)) {qDebug() << "Failed to send packet with sequence number:" << sequenceNumber - 1;serial.close();return -1;}serial.waitForBytesWritten(100);}serial.close();qDebug() << "All packets sent successfully.";return 0;
}
代码解释
- 创建和初始化:展示了如何创建和初始化
QByteArray
。 - 访问和修改数据:展示了如何访问和修改
QByteArray
的数据。 - 转换:展示了
QByteArray
和QString
之间的转换。 - 查找和分割:展示了如何查找子串和分割
QByteArray
。 - 文件操作:展示了如何使用
QByteArray
读取和写入文件。 - 与串口结合使用:展示了如何使用
QByteArray
创建数据包并通过串口发送。
通过这些示例,可以更好地理解和使用 QByteArray
处理和传输数据。QByteArray
是 Qt 框架中处理字节数据的强大工具。它不仅能存储和操作字节数据,还能进行多种转换和操作。以下是一些常见的用法:
常见操作
创建和初始化
QByteArray byteArray1; // 创建一个空的 QByteArray
QByteArray byteArray2("Hello, World!"); // 使用字符串初始化
QByteArray byteArray3(10, 'a'); // 创建一个大小为10且填充字符'a'的 QByteArray
访问和修改数据
QByteArray byteArray("Hello, World!");
char firstChar = byteArray[0]; // 访问第一个字符
byteArray[0] = 'h'; // 修改第一个字符
byteArray.append(" Goodbye!"); // 追加字符串
QByteArray.mid()
mid
方法用于从 QByteArray
中截取特定范围的子数组。
QByteArray array("Hello, World!");
QByteArray subArray = array.mid(0, 5); // 截取从索引0开始长度为5的子数组
qDebug() << subArray; // 输出: "Hello"
QByteArray.at()
at
方法用于访问 QByteArray
中指定索引处的字节。
QByteArray array("Hello, World!");
char charAt5 = array.at(5); // 访问索引5处的字符
qDebug() << charAt5; // 输出: ','
转换和输出
toUInt
方法
将 QByteArray
中的内容转换为无符号整数。
QByteArray array = QByteArray::fromHex("0100010001");
bool ok;
unsigned int value = array.mid(0, 4).toUInt(&ok, 16); // 将前4个字节转换为16进制整数
qDebug() << value; // 输出: 16777473 (0x01000100)
toHex
方法
将 QByteArray
中的内容转换为16进制字符串。
QByteArray array = QByteArray::fromHex("0100010001");
QByteArray hexString = array.mid(0, 4).toHex(); // 将前4个字节转换为16进制字符串
qDebug() << hexString; // 输出: "01000100"
示例应用:处理和发送数据
结合前面的示例,将 QByteArray
用于串口数据传输:
#include <QApplication>
#include <QFileDialog>
#include <QFile>
#include <QSerialPort>
#include <QDebug>QByteArray createHeader(quint32 sequenceNumber) {QByteArray header;header.append("HEADER");header.append(QByteArray::number(sequenceNumber));return header;
}QByteArray createFooter() {QByteArray footer;footer.append("FOOTER");return footer;
}bool sendPacket(QSerialPort &serial, quint32 sequenceNumber, const QByteArray &data) {QByteArray packet;packet.append(createHeader(sequenceNumber));packet.append(data);packet.append(createFooter());qint64 bytesWritten = serial.write(packet);return bytesWritten == packet.size();
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QString filePath = QFileDialog::getOpenFileName(nullptr, "Open Binary File", "", "Binary Files (*.bin);;All Files (*)");if (filePath.isEmpty()) {qDebug() << "No file selected.";return -1;}QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {qDebug() << "Cannot open file for reading:" << file.errorString();return -1;}QByteArray fileData = file.readAll();file.close();QSerialPort serial;serial.setPortName("COM3");serial.setBaudRate(QSerialPort::Baud9600);serial.setDataBits(QSerialPort::Data8);serial.setParity(QSerialPort::NoParity);serial.setStopBits(QSerialPort::OneStop);serial.setFlowControl(QSerialPort::NoFlowControl);if (!serial.open(QIODevice::WriteOnly)) {qDebug() << "Cannot open serial port:" << serial.errorString();return -1;}int packetSize = 128;int totalSize = fileData.size();quint32 sequenceNumber = 0;for (int i = 0; i < totalSize; i += packetSize) {QByteArray dataChunk = fileData.mid(i, packetSize);if (!sendPacket(serial, sequenceNumber++, dataChunk)) {qDebug() << "Failed to send packet with sequence number:" << sequenceNumber - 1;serial.close();return -1;}serial.waitForBytesWritten(100);}serial.close();qDebug() << "All packets sent successfully.";return 0;
}
代码解释
QByteArray.mid()
:截取从指定索引开始指定长度的子数组。QByteArray.at()
:访问指定索引处的字节。toUInt
和toHex
:将QByteArray
转换为无符号整数和16进制字符串。- 示例应用:展示了如何使用
QByteArray
创建数据包并通过串口发送。
通过这些示例,可以更好地理解和使用 QByteArray
进行各种数据操作。
相关文章:
QT QByteArray 的用法
QByteArray 是 Qt 中用于处理原始字节数据的类,类似于标准库中的 std::vector<char> 或 std::string,但具有更多适合Qt框架的功能。它可以用来处理文本和二进制数据,并提供了一些方便的方法进行数据操作。下面是一些常见的用法示例&…...

InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)
前言 InPixio Photo Cutter是一款懒人抠图工具,采用了增强的算法切割技术,可以在不影响图像质量的情况下,允许用户从照片中删除任何物体或人物,并且保持其完整的质量。你只需点击几下鼠标,便可从照片中剪下任何细节、…...

Java17 --- SpringSecurity之OAuth2
一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…...
服务器上线的一些事
最近不少人在上线上遇到问题 对于最近的上戏 进行一个坑或操作步骤的总结 以及遇到这些之后如何做 关于选项的选择 1 对于是否要在一个小时前释放 这个是看个人的 2 对于选择一台服务器还是两台呢?这个是最后限制 一台 这个免费的服务器 是有一个两百的额度的 选择…...
OceanBase-docker安装、连接数据库、修改mysql用户密码
OceanBase-docker安装、连接数据库、修改mysql用户密码 安装拉取镜像开启容器验证 连接数据库1.直接连接的方式修改数据库密码2.先进入镜像再连接数据库的方式进入镜像无密码有秘密 本人使用docker安装的oceanbase 安装 拉取镜像 docker pull oceanbase/oceanbase-ce:3.1.4 …...
浪潮(Inspur)服务器硬件监控指标解读
随着企业业务的快速发展,服务器的稳定运行成为保障业务连续性的关键。浪潮(Inspur)服务器以其卓越的性能和稳定性,在数据中心中扮演着重要角色。 为了确保服务器的稳定运行,监控易作为一款专业的IT基础设施监控软件&am…...
极简opencv操作xml文件
目标 修改xml文件,先产生一个临时文件,拷贝,修改,改名,使用opencv 非常简单地就可以搞定配置xml文件 code #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/core/utils/files…...

更换域名流程记录
华为云的服务器,阿里云购买的域名。 1.购买域名 2.在域名服务商绑定服务器ip(以阿里云为例) 控制台->域名控制台->域名列表->点击域名->域名解析->添加记录 记录类型填A , 主机记录“”或“www”,记录值填服务器i…...

CSS 实现电影信息卡片
CSS 实现电影信息卡片 效果展示 CSS 知识点 CSS 综合知识运用 页面整体布局 <div class"card"><div class"poster"><img src"./poster.jpg" /></div><div class"details"><img src"./avtar…...
Skype机器人
这段代码是一个Skype机器人,它使用OpenAI的GPT模型来回答与基督教相关的问题。机器人会读取最近的聊天历史,生成一个回复,并发送给用户。以下是对代码每一部分的详细解释: 导入模块 import json import http.client from skpy import SkypeEventLoop, SkypeNewMessageEve…...

海外仓系统能解决海外仓哪些难题?海外仓标准化管理实用指南
海外仓管理问题常常导致业务流程变慢,根据我们的调查显示,至少有48%的海外仓每周都会出现一些“小意外”。甚至这些小问题每天都在发生,问题的出现已经严重影响到了海外仓业务的进行。今天我们将重点分析海外仓比较常见的一些问题,…...
从零开始精通Onvif之录像存储
💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 概述 Onvif的录像存储功能主要由Media、Recording和Replay三个关键服务共同支持。它们协同工作,为录像的存储、检索和播放提供了标准…...

vue3面试题八股集合——2024
vue3比vue2有什么优势? 性能更好,打包体积更小,更好的ts支持,更好的代码组织,更好的逻辑抽离,更多的新功能 描述Vu3生命周期 Options API的生命周期: beforeCreate: 在实例初始化之后、数据观…...

第2章 Rust初体验5/8:match表达式和模式匹配:更富表达力:猜骰子冷热游戏
讲动人的故事,写懂人的代码 2.5 故事3: 比较答案与点数之和 贾克强:“同学们,我们开始用三种语言来实现故事3吧!” 2.5.1 Rust版故事3 这个故事实在是轻松容易地实现了。赵可菲照着书,一下子就写好了。 @@ -1,4 +1,5 @@use rand::Rng; +use std::cmp::Ordering;use std…...

1台UG图形工作站实现5-7人共享使用
随着计算机辅助设计(CAD)和计算机辅助制造(CAM)技术的不断发展,UG图形工作站已成为许多行业不可或缺的重要工具。 对于许多中小型企业而言,购买多台高性能的UG图形工作站无疑是一笔巨大的开销,…...
Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程,当然真正的服务远程引入、以及配置迁移啥的都还没讲,但是本次我们先不接着讲MigrationRuleListener#onRefer方法,而是先…...

nodejs——原型链污染
一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象的概念,所以我们要先明确一点: JavaScript中一切引用类型都是对象,对象就是属性的集合。 Array类型、Function类型、Object类型、Date类型、RegExp类型等都是引用类型。 也就…...

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone
为了提高个人数据的安全性,用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能,但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码,您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…...

案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 Cacheable 是 Spring Framework 提供的一个注解,用于在方法执行前先检查缓存,如果缓存中已存在对应的值,则直接返回缓存中的值,而不执行该方法体。如果缓存中不存在对应的值,则执行方法体,并将方法的…...

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)
第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网:www.icairc.net 录用通知时间&…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...