当前位置: 首页 > news >正文

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 的数据。
  • 转换:展示了 QByteArrayQString 之间的转换。
  • 查找和分割:展示了如何查找子串和分割 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():访问指定索引处的字节。
  • toUInttoHex:将 QByteArray 转换为无符号整数和16进制字符串。
  • 示例应用:展示了如何使用 QByteArray 创建数据包并通过串口发送。

通过这些示例,可以更好地理解和使用 QByteArray 进行各种数据操作。

相关文章:

QT QByteArray 的用法

QByteArray 是 Qt 中用于处理原始字节数据的类&#xff0c;类似于标准库中的 std::vector<char> 或 std::string&#xff0c;但具有更多适合Qt框架的功能。它可以用来处理文本和二进制数据&#xff0c;并提供了一些方便的方法进行数据操作。下面是一些常见的用法示例&…...

InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)

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

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 对于选择一台服务器还是两台呢&#xff1f;这个是最后限制 一台 这个免费的服务器 是有一个两百的额度的 选择…...

OceanBase-docker安装、连接数据库、修改mysql用户密码

OceanBase-docker安装、连接数据库、修改mysql用户密码 安装拉取镜像开启容器验证 连接数据库1.直接连接的方式修改数据库密码2.先进入镜像再连接数据库的方式进入镜像无密码有秘密 本人使用docker安装的oceanbase 安装 拉取镜像 docker pull oceanbase/oceanbase-ce:3.1.4 …...

浪潮(Inspur)服务器硬件监控指标解读

随着企业业务的快速发展&#xff0c;服务器的稳定运行成为保障业务连续性的关键。浪潮&#xff08;Inspur&#xff09;服务器以其卓越的性能和稳定性&#xff0c;在数据中心中扮演着重要角色。 为了确保服务器的稳定运行&#xff0c;监控易作为一款专业的IT基础设施监控软件&am…...

极简opencv操作xml文件

目标 修改xml文件&#xff0c;先产生一个临时文件&#xff0c;拷贝&#xff0c;修改&#xff0c;改名&#xff0c;使用opencv 非常简单地就可以搞定配置xml文件 code #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/core/utils/files…...

更换域名流程记录

华为云的服务器&#xff0c;阿里云购买的域名。 1.购买域名 2.在域名服务商绑定服务器ip&#xff08;以阿里云为例&#xff09; 控制台->域名控制台->域名列表->点击域名->域名解析->添加记录 记录类型填A , 主机记录“”或“www”&#xff0c;记录值填服务器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…...

海外仓系统能解决海外仓哪些难题?海外仓标准化管理实用指南

海外仓管理问题常常导致业务流程变慢&#xff0c;根据我们的调查显示&#xff0c;至少有48%的海外仓每周都会出现一些“小意外”。甚至这些小问题每天都在发生&#xff0c;问题的出现已经严重影响到了海外仓业务的进行。今天我们将重点分析海外仓比较常见的一些问题&#xff0c…...

从零开始精通Onvif之录像存储

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 概述 Onvif的录像存储功能主要由Media、Recording和Replay三个关键服务共同支持。它们协同工作&#xff0c;为录像的存储、检索和播放提供了标准…...

vue3面试题八股集合——2024

vue3比vue2有什么优势&#xff1f; 性能更好&#xff0c;打包体积更小&#xff0c;更好的ts支持&#xff0c;更好的代码组织&#xff0c;更好的逻辑抽离&#xff0c;更多的新功能 描述Vu3生命周期 Options API的生命周期&#xff1a; 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人共享使用

随着计算机辅助设计&#xff08;CAD&#xff09;和计算机辅助制造&#xff08;CAM&#xff09;技术的不断发展&#xff0c;UG图形工作站已成为许多行业不可或缺的重要工具。 对于许多中小型企业而言&#xff0c;购买多台高性能的UG图形工作站无疑是一笔巨大的开销&#xff0c;…...

Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程&#xff0c;当然真正的服务远程引入、以及配置迁移啥的都还没讲&#xff0c;但是本次我们先不接着讲MigrationRuleListener#onRefer方法&#xff0c;而是先…...

nodejs——原型链污染

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

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

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

案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序

案例 Cacheable 是 Spring Framework 提供的一个注解&#xff0c;用于在方法执行前先检查缓存&#xff0c;如果缓存中已存在对应的值&#xff0c;则直接返回缓存中的值&#xff0c;而不执行该方法体。如果缓存中不存在对应的值&#xff0c;则执行方法体&#xff0c;并将方法的…...

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…...

别再只用DoDragDrop了!手把手教你用WPF实现一个能拖拽合并数据的自定义控件(附完整源码)

WPF高级拖拽交互实战&#xff1a;从原生API局限到自定义控件设计 在构建现代桌面应用时&#xff0c;流畅自然的拖拽交互往往能极大提升用户体验。WPF虽然提供了基础的DoDragDrop API&#xff0c;但当我们需要实现复杂场景如卡片合并、动态数据交换时&#xff0c;原生方案就显得…...

3大核心优势!Steamless开源工具链实现高效游戏文件DRM移除

3大核心优势&#xff01;Steamless开源工具链实现高效游戏文件DRM移除 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamless aims to…...

【JavaWeb学习 | 第六篇】CSS(万字长文警告)

【Java Web学习 | 第六篇】CSS&#xff08;万字长文警告&#xff09; - 现代布局核心&#xff1a;Flexbox Grid 响应式设计&#xff08;2026最新版&#xff09; 这是 CSS 系列的高潮篇&#xff01;前面我们已经掌握了基础语法、元素显示模式、背景和盒子模型。现在终于来到现…...

DiffBIR实战:用Stable Diffusion 2.1修复模糊老照片(附完整配置流程)

DiffBIR实战&#xff1a;用Stable Diffusion 2.1修复模糊老照片&#xff08;附完整配置流程&#xff09; 翻开泛黄的相册&#xff0c;那些承载着珍贵记忆的老照片往往因年代久远而变得模糊、褪色甚至破损。传统修复方法需要专业设计师耗费数小时手动修复&#xff0c;而如今&…...

ReAct让AI像人一样“边想边做”,轻松搞定复杂问题!

写在前面 欢迎回到我们的智能体架构系列。上一期我们聊了工具调用&#xff0c;让智能体“长出了手”&#xff0c;能去外部世界获取信息。但很快我们就发现&#xff0c;光有手还不够。面对“谁是《沙丘》制片公司的CEO&#xff0c;以及该公司最近一部电影的预算&#xff1f;”这…...

用Multisim 14.0和AD620/OP07,手把手教你搭建一个能用的简易心电放大电路

从零开始构建心电放大电路&#xff1a;Multisim 14.0与AD620/OP07实战指南 在生物医学信号处理领域&#xff0c;心电信号采集一直是极具挑战性的课题。想象一下&#xff0c;当医生将电极贴在你胸口时&#xff0c;那些微弱的电信号是如何被放大并转化为清晰波形图的&#xff1f;…...

Mask2Former与MaskFormer对比分析:第二代模型的改进与创新点

Mask2Former与MaskFormer对比分析&#xff1a;第二代模型的改进与创新点 【免费下载链接】Mask2Former Code release for "Masked-attention Mask Transformer for Universal Image Segmentation" 项目地址: https://gitcode.com/gh_mirrors/ma/Mask2Former M…...

Babylon.js 官方Demo速查手册:按技术点分类的实战预览图+源码直达

Babylon.js 技术全景速查手册&#xff1a;从核心功能到高阶实战 当你第一次打开Babylon.js官网的Demo页面时&#xff0c;可能会被上百个案例晃花了眼。作为一款功能强大的Web3D引擎&#xff0c;它几乎涵盖了从基础渲染到高级特效的所有技术点。但问题来了&#xff1a;当你想实现…...

SEO网站推广的发展历程是怎样的

<h2>SEO网站推广的发展历程&#xff1a;从初始阶段到现代优化</h2> <p>随着互联网的迅速发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;作为网站推广的重要手段&#xff0c;经历了漫长而复杂的发展历程。SEO的进化不仅改变了网站如何被搜索引擎索…...

LIN Switch Method:从硬件革新到软件流程,揭秘车内氛围灯自动寻址的完整闭环

1. 为什么车内氛围灯需要自动寻址技术 十年前的车内照明还停留在基础功能阶段&#xff0c;而现在的高端车型已经将氛围灯玩出了新花样。想象一下&#xff0c;当你打开车门时&#xff0c;迎宾灯像流水一样从车头滑向车尾&#xff1b;调节空调温度时&#xff0c;出风口周围的灯光…...