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 录用通知时间&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...