QByteArray

本文详细介绍了QByteArray在串口通信中的应用,包括初始化、访问赋值、操作、查找比较以及数据转换。QByteArray支持多种方式访问,如[]、at()、data[]和constData[]。数据转换涵盖HEX、数值、大小写及字符串间的转换。此外,还展示了如何将QByteArray转换为不同进制数值,以及从字符串转为数值类型。这些功能对于串口通信中的数据处理至关重要。

QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述。本文通过以下几个部分加以介绍:
1. 初始化

2. 访问与赋值

3. 添加、删除、插入与替换操作

4. 查找与比较

5. 数据转换与处理

1 初始化

2 访问与赋值

    访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下:
 

QByteArray ba;
ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31;
qDebug()<<"[]"<<ba[2]; //[] d
qDebug()<<"at()"<<ba.at(2); //at() d
qDebug()<<"data()"<<ba.data()[2]; //data() d
qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1

3 添加、删除、插入与替换操作

4 查找与比较

5 数据转换与处理

    从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

    1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

    2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

    3)转为整型、浮点型等数值类型;

    4)大小写转换;

    5)转为字符串类型;

5.1 Hex转换

    把Hex编码转换为char存储到QByteArray:

QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"

  把QByteArray转为Hex编码:

QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return "303132"

5.2 数值转换与输出

    尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

    把单个字符转为2-36进制数据格式:

int n = 63;
qDebug()<<QByteArray::number(n);              // returns "63"
qDebug()<<QByteArray::number(n, 16);          // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"
qDebug()<<QByteArray::number(n, 2);          // returns "111111"
qDebug()<<QByteArray::number(n, 8);          // returns "77"

 按照指定进制格式直接复制,其中n可以是各类常见数值类型:

QByteArray ba;
int n = 63;
ba.setNum(n);           // ba == "63"
ba.setNum(n, 16);       // ba == "3f"

把数值按指定格式和小数位转换输出,小数位四舍五入

QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
qDebug()<<ba1;  // returns "1.235E+01"
qDebug()<<ba2;  // returns "12.346"

5.3 字符串数值转为各类数值

    QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

QByteArray strInt("1234");
bool ok0;
qDebug() << strInt.toInt();   // return 1234
qDebug() << strInt.toInt(&ok0,16);   // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
 
QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt();   // return 0, 小数均视为0
qDebug() << string.toInt(&ok1,16);   // return 0, 小数均视为0
qDebug() << string.toFloat();   // return 1234.56
qDebug() << string.toDouble();   // return 1234.56
 
QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16);     // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10);     // return 0, ok == false, 转为十进制失败

5.4 大小写转换

    QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:

QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();
// y == "qt by the qt company"
 
QByteArray z = x.toUpper();
// z == "QT BY THE QT COMPANY"

5.5 与字符串互转

    QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表

    QByteArray转为QString示例:
 

QByteArray ba("abc123");
QString str = ba; 
//或str.prepend(ba);
qDebug()<<str ;
//输出:"abc123"

QString转为QByteArray示例:

QString str("abc123");
QByteArray ba = str.toLatin1();
qDebug()<<ba;
//输出:"abc123"

### 关于 `QByteArray` 的使用方法 `QByteArray` 是 Qt 框架中的一个重要类,主要用于处理字节数组。它可以存储原始的二进制数据以及以 8 位字符编码表示的文本字符串[^3]。 #### 创建 `QByteArray` 可以通过多种方式创建一个 `QByteArray` 对象: - **创建空的 `QByteArray`** ```cpp QByteArray byteArray1; ``` 这会创建一个空的 `QByteArray` 实例[^1]。 - **通过字符串初始化** ```cpp QByteArray byteArray2("Hello, World!"); ``` 这里我们用 C 风格字符串 `"Hello, World!"` 初始化了一个新的 `QByteArray` 实例[^1]。 - **指定大小并填充特定字符** ```cpp QByteArray byteArray3(10, 'a'); ``` 这段代码创建了一个长度为 10 并且每个位置都填充值 `'a'` 的 `QByteArray`[^1]。 #### 数据转换 `QByteArray` 和其他类型的对象之间可以相互转换,比如与 `QString` 进行互转: - **从 `QString` 转换到 `QByteArray` (UTF-8 编码)** ```cpp QString str = "Hello, Qt!"; QByteArray byteArray = str.toUtf8(); ``` 此操作将 `QString` 中的内容按照 UTF-8 编码规则转化为字节流形式存入 `byteArray` 中[^2]。 - **从 `QByteArray` 转回 `QString`** ```cpp QString str2 = QString::fromUtf8(byteArray); ``` 该语句实现了反向过程——把之前保存好的字节数组重新解析成可读取的人类语言文字串[^2]。 #### 常见功能展示 以下是几个常用的关于 `QByteArray` 处理的例子: - **追加新内容至已有数组末端** ```cpp QByteArray arrayA("Qt "); arrayA.append("is great."); // 结果: "Qt is great." ``` - **查找子序列首次出现的位置** ```cpp int index = byteArray.indexOf("World"); if(index != -1){ qDebug() << "Substring found at position:" << index; } else{ qDebug() << "Substring not found."; } ``` - **替换部分区域内的值** ```cpp byteArray.replace(7,5,"Universe"); // 将原字符串中第7个字符起连续五个单位替换成"Universe" ``` 以上就是有关如何运用 `QByteArray` 来完成基本任务的一些指导说明[^3]。 ### 示例程序 下面给出一段完整的例子来综合应用上面提到的知识点: ```cpp #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create and initialize byte arrays. QByteArray emptyByteArry; QByteArray helloWorld("Hello, World!"); // Convert between QString & QByteArray. QString originalStr = "Original String"; QByteArray utf8Bytes = originalStr.toUtf8(); QString convertedBackString = QString::fromUtf8(utf8Bytes); qInfo() << "Converted Back String:" << convertedBackString; return a.exec(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值