• QT QByteArray 的用法


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

    创建和初始化

    1. #include <QByteArray>
    2. #include <QDebug>
    3. int main() {
    4. QByteArray byteArray1; // 创建一个空的 QByteArray
    5. QByteArray byteArray2("Hello, World!"); // 使用字符串初始化
    6. QByteArray byteArray3(10, 'a'); // 创建一个大小为10且填充字符'a'的 QByteArray
    7. qDebug() << "byteArray1:" << byteArray1;
    8. qDebug() << "byteArray2:" << byteArray2;
    9. qDebug() << "byteArray3:" << byteArray3;
    10. return 0;
    11. }

    访问和修改数据

    1. #include <QByteArray>
    2. #include <QDebug>
    3. int main() {
    4. QByteArray byteArray("Hello, World!");
    5. // 访问数据
    6. char firstChar = byteArray[0];
    7. qDebug() << "First character:" << firstChar;
    8. // 修改数据
    9. byteArray[0] = 'h';
    10. qDebug() << "Modified byteArray:" << byteArray;
    11. // 使用 append 方法
    12. byteArray.append(" Goodbye!");
    13. qDebug() << "Appended byteArray:" << byteArray;
    14. return 0;
    15. }

    转换

    1. #include <QByteArray>
    2. #include <QDebug>
    3. #include <QString>
    4. int main() {
    5. QByteArray byteArray("Hello, World!");
    6. // 转换为 QString
    7. QString str = QString::fromUtf8(byteArray);
    8. qDebug() << "QString:" << str;
    9. // 从 QString 转换为 QByteArray
    10. QByteArray byteArrayFromString = str.toUtf8();
    11. qDebug() << "QByteArray from QString:" << byteArrayFromString;
    12. return 0;
    13. }

    查找和分割

    1. #include <QByteArray>
    2. #include <QDebug>
    3. int main() {
    4. QByteArray byteArray("Hello, World! Hello, Qt!");
    5. // 查找子串
    6. int index = byteArray.indexOf("Hello");
    7. qDebug() << "First occurrence of 'Hello':" << index;
    8. // 分割
    9. QList<QByteArray> parts = byteArray.split(',');
    10. for (const QByteArray &part : parts) {
    11. qDebug() << "Part:" << part;
    12. }
    13. return 0;
    14. }

    文件操作

    1. #include <QFile>
    2. #include <QByteArray>
    3. #include <QDebug>
    4. int main() {
    5. QFile file("example.bin");
    6. if (file.open(QIODevice::ReadOnly)) {
    7. QByteArray fileData = file.readAll();
    8. file.close();
    9. qDebug() << "File data:" << fileData;
    10. // 对数据进行操作...
    11. // 写回文件
    12. if (file.open(QIODevice::WriteOnly)) {
    13. file.write(fileData);
    14. file.close();
    15. }
    16. } else {
    17. qDebug() << "Failed to open file.";
    18. }
    19. return 0;
    20. }

    与串口结合使用

    结合前面的示例,将 QByteArray 用于串口数据传输:

    1. #include <QApplication>
    2. #include <QFileDialog>
    3. #include <QFile>
    4. #include <QSerialPort>
    5. #include <QDebug>
    6. QByteArray createHeader(quint32 sequenceNumber) {
    7. QByteArray header;
    8. header.append("HEADER");
    9. header.append(QByteArray::number(sequenceNumber));
    10. return header;
    11. }
    12. QByteArray createFooter() {
    13. QByteArray footer;
    14. footer.append("FOOTER");
    15. return footer;
    16. }
    17. bool sendPacket(QSerialPort &serial, quint32 sequenceNumber, const QByteArray &data) {
    18. QByteArray packet;
    19. packet.append(createHeader(sequenceNumber));
    20. packet.append(data);
    21. packet.append(createFooter());
    22. qint64 bytesWritten = serial.write(packet);
    23. return bytesWritten == packet.size();
    24. }
    25. int main(int argc, char *argv[]) {
    26. QApplication app(argc, argv);
    27. QString filePath = QFileDialog::getOpenFileName(nullptr, "Open Binary File", "", "Binary Files (*.bin);;All Files (*)");
    28. if (filePath.isEmpty()) {
    29. qDebug() << "No file selected.";
    30. return -1;
    31. }
    32. QFile file(filePath);
    33. if (!file.open(QIODevice::ReadOnly)) {
    34. qDebug() << "Cannot open file for reading:" << file.errorString();
    35. return -1;
    36. }
    37. QByteArray fileData = file.readAll();
    38. file.close();
    39. QSerialPort serial;
    40. serial.setPortName("COM3");
    41. serial.setBaudRate(QSerialPort::Baud9600);
    42. serial.setDataBits(QSerialPort::Data8);
    43. serial.setParity(QSerialPort::NoParity);
    44. serial.setStopBits(QSerialPort::OneStop);
    45. serial.setFlowControl(QSerialPort::NoFlowControl);
    46. if (!serial.open(QIODevice::WriteOnly)) {
    47. qDebug() << "Cannot open serial port:" << serial.errorString();
    48. return -1;
    49. }
    50. int packetSize = 128;
    51. int totalSize = fileData.size();
    52. quint32 sequenceNumber = 0;
    53. for (int i = 0; i < totalSize; i += packetSize) {
    54. QByteArray dataChunk = fileData.mid(i, packetSize);
    55. if (!sendPacket(serial, sequenceNumber++, dataChunk)) {
    56. qDebug() << "Failed to send packet with sequence number:" << sequenceNumber - 1;
    57. serial.close();
    58. return -1;
    59. }
    60. serial.waitForBytesWritten(100);
    61. }
    62. serial.close();
    63. qDebug() << "All packets sent successfully.";
    64. return 0;
    65. }

    代码解释

    • 创建和初始化:展示了如何创建和初始化 QByteArray
    • 访问和修改数据:展示了如何访问和修改 QByteArray 的数据。
    • 转换:展示了 QByteArrayQString 之间的转换。
    • 查找和分割:展示了如何查找子串和分割 QByteArray
    • 文件操作:展示了如何使用 QByteArray 读取和写入文件。
    • 与串口结合使用:展示了如何使用 QByteArray 创建数据包并通过串口发送。

    通过这些示例,可以更好地理解和使用 QByteArray 处理和传输数据。QByteArray 是 Qt 框架中处理字节数据的强大工具。它不仅能存储和操作字节数据,还能进行多种转换和操作。以下是一些常见的用法:

    常见操作

    创建和初始化

    1. QByteArray byteArray1; // 创建一个空的 QByteArray
    2. QByteArray byteArray2("Hello, World!"); // 使用字符串初始化
    3. QByteArray byteArray3(10, 'a'); // 创建一个大小为10且填充字符'a'的 QByteArray

    访问和修改数据

    1. QByteArray byteArray("Hello, World!");
    2. char firstChar = byteArray[0]; // 访问第一个字符
    3. byteArray[0] = 'h'; // 修改第一个字符
    4. byteArray.append(" Goodbye!"); // 追加字符串

    QByteArray.mid()

    mid 方法用于从 QByteArray 中截取特定范围的子数组。

    1. QByteArray array("Hello, World!");
    2. QByteArray subArray = array.mid(0, 5); // 截取从索引0开始长度为5的子数组
    3. qDebug() << subArray; // 输出: "Hello"

    QByteArray.at()

    at 方法用于访问 QByteArray 中指定索引处的字节。

    1. QByteArray array("Hello, World!");
    2. char charAt5 = array.at(5); // 访问索引5处的字符
    3. qDebug() << charAt5; // 输出: ','

    转换和输出

    toUInt 方法

    QByteArray 中的内容转换为无符号整数。

    1. QByteArray array = QByteArray::fromHex("0100010001");
    2. bool ok;
    3. unsigned int value = array.mid(0, 4).toUInt(&ok, 16); // 将前4个字节转换为16进制整数
    4. qDebug() << value; // 输出: 16777473 (0x01000100)

    toHex 方法

    QByteArray 中的内容转换为16进制字符串。

    1. QByteArray array = QByteArray::fromHex("0100010001");
    2. QByteArray hexString = array.mid(0, 4).toHex(); // 将前4个字节转换为16进制字符串
    3. qDebug() << hexString; // 输出: "01000100"

    示例应用:处理和发送数据

    结合前面的示例,将 QByteArray 用于串口数据传输:

    1. #include <QApplication>
    2. #include <QFileDialog>
    3. #include <QFile>
    4. #include <QSerialPort>
    5. #include <QDebug>
    6. QByteArray createHeader(quint32 sequenceNumber) {
    7. QByteArray header;
    8. header.append("HEADER");
    9. header.append(QByteArray::number(sequenceNumber));
    10. return header;
    11. }
    12. QByteArray createFooter() {
    13. QByteArray footer;
    14. footer.append("FOOTER");
    15. return footer;
    16. }
    17. bool sendPacket(QSerialPort &serial, quint32 sequenceNumber, const QByteArray &data) {
    18. QByteArray packet;
    19. packet.append(createHeader(sequenceNumber));
    20. packet.append(data);
    21. packet.append(createFooter());
    22. qint64 bytesWritten = serial.write(packet);
    23. return bytesWritten == packet.size();
    24. }
    25. int main(int argc, char *argv[]) {
    26. QApplication app(argc, argv);
    27. QString filePath = QFileDialog::getOpenFileName(nullptr, "Open Binary File", "", "Binary Files (*.bin);;All Files (*)");
    28. if (filePath.isEmpty()) {
    29. qDebug() << "No file selected.";
    30. return -1;
    31. }
    32. QFile file(filePath);
    33. if (!file.open(QIODevice::ReadOnly)) {
    34. qDebug() << "Cannot open file for reading:" << file.errorString();
    35. return -1;
    36. }
    37. QByteArray fileData = file.readAll();
    38. file.close();
    39. QSerialPort serial;
    40. serial.setPortName("COM3");
    41. serial.setBaudRate(QSerialPort::Baud9600);
    42. serial.setDataBits(QSerialPort::Data8);
    43. serial.setParity(QSerialPort::NoParity);
    44. serial.setStopBits(QSerialPort::OneStop);
    45. serial.setFlowControl(QSerialPort::NoFlowControl);
    46. if (!serial.open(QIODevice::WriteOnly)) {
    47. qDebug() << "Cannot open serial port:" << serial.errorString();
    48. return -1;
    49. }
    50. int packetSize = 128;
    51. int totalSize = fileData.size();
    52. quint32 sequenceNumber = 0;
    53. for (int i = 0; i < totalSize; i += packetSize) {
    54. QByteArray dataChunk = fileData.mid(i, packetSize);
    55. if (!sendPacket(serial, sequenceNumber++, dataChunk)) {
    56. qDebug() << "Failed to send packet with sequence number:" << sequenceNumber - 1;
    57. serial.close();
    58. return -1;
    59. }
    60. serial.waitForBytesWritten(100);
    61. }
    62. serial.close();
    63. qDebug() << "All packets sent successfully.";
    64. return 0;
    65. }

    代码解释

    • QByteArray.mid():截取从指定索引开始指定长度的子数组。
    • QByteArray.at():访问指定索引处的字节。
    • toUInttoHex:将 QByteArray 转换为无符号整数和16进制字符串。
    • 示例应用:展示了如何使用 QByteArray 创建数据包并通过串口发送。

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

  • 相关阅读:
    机器学习——评估和改进学习算法
    pytorch 搭建 VGG 网络
    PostgreSQL修炼之道笔记之基础篇(九)
    电子班牌解决方案-最新全套文件
    【链表专题】
    TorchDynamo初探②:Torch.FX调研和实践
    【每日一题】只出现一次的数字 III
    Zookeeper特性与节点数据类型详解
    神经网络应用场景——自然语言处理
    Golang抓包:实现网络数据包捕获与分析
  • 原文地址:https://blog.csdn.net/a15236617777/article/details/139624595