QT QByteArray 的用法

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

创建和初始化

#include <QByteArray>
#include <QDebug>

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

    qDebug() << "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!");

    // 转换为 QString
    QString str = QString::fromUtf8(byteArray);
    qDebug() << "QString:" << str;

    // 从 QString 转换为 QByteArray
    QByteArray 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 进行各种数据操作。

相关推荐

  1. nc

    2024-06-14 00:12:03       63 阅读
  2. QueryWrapper

    2024-06-14 00:12:03       30 阅读
  3. axios

    2024-06-14 00:12:03       33 阅读
  4. React <> </>

    2024-06-14 00:12:03       32 阅读
  5. pymysql基本

    2024-06-14 00:12:03       60 阅读
  6. css_auto

    2024-06-14 00:12:03       56 阅读
  7. 关于QUOTENAME

    2024-06-14 00:12:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 00:12:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 00:12:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 00:12:03       82 阅读
  4. Python语言-面向对象

    2024-06-14 00:12:03       91 阅读

热门阅读

  1. Dijkstra算法的原理

    2024-06-14 00:12:03       34 阅读
  2. CompletableFuture 异常捕获方式

    2024-06-14 00:12:03       37 阅读
  3. react路由的使用

    2024-06-14 00:12:03       33 阅读
  4. 【BeX5】知识中心

    2024-06-14 00:12:03       36 阅读
  5. PDF格式分析(八十六)——修订注释(Redaction)

    2024-06-14 00:12:03       38 阅读
  6. 【Linux之·软件更新源】

    2024-06-14 00:12:03       31 阅读
  7. 49. 简单数字加密

    2024-06-14 00:12:03       30 阅读
  8. Python实战:分析产品价格波动的数据探索

    2024-06-14 00:12:03       36 阅读
  9. 动态规划法学习

    2024-06-14 00:12:03       33 阅读
  10. python 循环导入(circular imports)解决方法

    2024-06-14 00:12:03       40 阅读
  11. spring

    spring

    2024-06-14 00:12:03      28 阅读
  12. ZC2205-24V500mAUltralow-Quiescent-Current LDO

    2024-06-14 00:12:03       34 阅读
  13. 613作业

    613作业

    2024-06-14 00:12:03      35 阅读