QByteArray 是 Qt 中用于处理原始字节数据的类,类似于标准库中的 std::vector
创建和初始化
#include#include 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#include 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#include #include 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#include int main() { QByteArray byteArray("Hello, World! Hello, Qt!"); // 查找子串 int index = byteArray.indexOf("Hello"); qDebug() << "First occurrence of 'Hello':" << index; // 分割 QList parts = byteArray.split(','); for (const QByteArray &part : parts) { qDebug() << "Part:" << part; } return 0; }
文件操作
#include#include #include 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#include #include #include #include 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
#include #include #include #include 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 进行各种数据操作。
还没有评论,来说两句吧...