QByteArray
是 Qt 中用于处理原始字节数据的类,类似于标准库中的 std::vector
或 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
的数据。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
进行各种数据操作。