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 进行各种数据操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学会python——密码加密(python实例四)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、对输入的字符加密 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强…

Hexapod C-887使用手册 -- 4,5,6

4 - 拆包 小心拆包C-887 根据合同和发货注意比较发货范围的内容&#xff1a; 检查危险符号的内容。如果任何零件损坏或缺失&#xff0c;立即联系客服部门。 保存所有包装材料&#xff0c;以防产品需要返厂。 5 - 安装 本章中 安装一般注意 安装PC软件 确保通风 接地C-…

vue reduce 求和

Number(j / dataCategory.value[i].data.reduce((x,y)>xy) * 100).toFixed(0)

JAVA学习笔记DAY5——Spring_Ioc

文章目录 Bean配置注解方式配置注解配置文件调用组件 注解方法作用域 DI注入注解引用类型自动装配文件结构自动装配实现 基本数据类型DI装配 Bean配置 注解方式配置 类上添加Ioc注解配置文件中告诉SpringIoc容器要检查哪些包 注解仅是一个标记 注解 不同注解仅是为了方便开…

开窗函数MYSQL

在MySQL中&#xff0c;开窗函数允许你对一组行执行计算&#xff0c;并返回每个行的计算结果。这些函数对于执行复杂的分析操作非常有用&#xff0c;比如计算移动平均值、累计总和、行排名等。以下是对MySQL中一些常用开窗函数的细致讲解&#xff1a; ### 1. ROW_NUMBER() ROW_…

LeetCode --- 132双周赛

题目列表 3174. 清除数字 3175. 找到连续赢 K 场比赛的第一位玩家 3176. 求出最长好子序列 I 3177. 求出最长好子序列 II 一、清理数字 这题直接根据题目&#xff0c;进行模拟即可&#xff0c;大体的思路是遍历字符串&#xff0c;遇到字母就加入答案&#xff0c;遇到数字就…

网络协议四

一、云中网络 物理机的劣势&#xff1a; 1&#xff09;一旦需要扩容 CPU、内存、硬盘&#xff0c;都需要去机房手动弄&#xff0c;非常麻烦 2&#xff09;采购的机器往往动不动几百 G 的内存&#xff0c;而每个应用往往可能只需要 4 核 8G 3&#xff09;一台机器&#xff0c;…

怎么改变图片分辨率dpi数值?图片改分辨率的在线技巧

在上传图片的时候除了图片大小、尺寸等要求之外&#xff0c;修改图片分辨率也是比较常见的一个问题&#xff0c;需要将图片按照平台的要求修改完成后才可以正常使用。当遇到图片dpi的数值不满足使用需求的时候&#xff0c;有什么方法能够更加快捷的修改图片dpi呢&#xff1f;今…

从零开始利用MATLAB进行FPGA设计(七)固化程序

FPGA开发板&#xff1a;AX7020&#xff1b;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I&#xff0c;400引脚 FBGA 封装。 HARDWARE PLATFORM在2019以后的vivado中已经没有了。本期实际上已经与MATLAB无关&#xff0c;主要介绍通过VITIS等方法进行程序固化。 目录 ZY…

leetcode打卡#day50 188. 买卖股票的最佳时机 IV、 309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

188. 买卖股票的最佳时机 IV class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.size() 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(2 * k 1, 0));for (int j 1; j < 2 * k; j 2) {dp…

Github 2024-06-13 Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Shell项目1多存储文件列表/WebDAV程序 创建周期:1265 天开发语言:Go协议类型:GNU Affero General Public License v…

linux安装dgl

1.DGL官网、选择与自己cuda、python版本匹配的dgl的whl文件CUDA11.8、python10并下载 2.用pip install运行 pip install /home/u2023170749/download/dgl-2.2.0cu118-cp310-cp310-manylinux1_x86_64.whl

git提交错了?别慌,直接删除提交记录

git revert 和git reset &#xff01;这两个命令都有撤销操作的功能&#xff01;哪一个可以删除提提交记录&#xff1f;&#xff1f;&#xff1f; 使用git revert撤销提交 revert的英文释义是回复、恢复&#xff08;到原来的状态&#xff09; 作用 git revert 是 Git 中用于撤…

如何通过SOLIDWORKS教育版提高学生技能培养未来人才?

在当今这个科技日新月异的时代&#xff0c;掌握先进的数字化工具已经成为了一项需备的技能。作为一款功能强大的3D CAD软件&#xff0c;SOLIDWORKS教育版正是一个帮助学生提升技能、培养未来人才的重要工具。那么&#xff0c;如何通过SOLIDWORKS教育版提高学生技能呢&#xff1…

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…

mysql定时任务事件清理单表数据

DELIMITER $$删除已有任务事件 DROP EVENT IF EXISTS del_message;创建事件 CREATE EVENT del_message表示创建时间定时周期&#xff0c;以及开始时间&#xff0c;该处表示从明天2点从开始&#xff0c;7天执行一次该任务 ON SCHEDULE EVERY 7 day STARTS date_add(date( ADD…

12306 火车票价格解析 (PHP 解析)

1. 从接口拿数据 日期 出发站 终点站 都填上 xxx/otn/leftTicketPrice/queryAllPublicPrice?leftTicketDTO.train_date2024-06-15&leftTicketDTO.from_stationBJP&leftTicketDTO.to_stationSJP&purpose_codesADULT 返回的数据是这样的 {"validateMess…

ASP.NET MVC企业级程序设计(查,删,展示详情,日期转换,¥字符串拼接)

题目&#xff1a; 实现过程 控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;namespace MvcApplication1.Controllers {public class HomeController : Controller{//// GET: /Home/public Action…

【Bootstrap Faster R-CNN】《Is Faster R-CNN Doing Well for Pedestrian Detection?》

ECCV-2016 中山大学 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Region Proposal Network for Pedestrian Detection4.2 Feature Extraction4.3 Boosted Forest 5 Experiments5.1 Datasets and Metrics5.2 Ablation Experim…

python主线程捕获子线程异常

目录 问题抛出&#xff1a;子线程出现异常&#xff0c;主线程仍会正常进行吗 设计实现python主线程捕获子线程异常 需求 问题 解决思路 示例代码 问题抛出&#xff1a;子线程出现异常&#xff0c;主线程仍会正常进行吗 结论&#xff1a;子线程出现异常&#xff0c;主线程…