QByteArray类提供了一个字节数组;QByteArray可用于存储原始字节(包括'\0')和传统的以'\0'结尾的8位字符串。使用QByteArray比使用const char *更方便。
QByteArray常用于串口通讯中。
QByteArray适用的两种主要情况是:当需要存储原始二进制数据时,以及当内存保存非常关键时(例如,对于嵌入式Linux使用Qt)。
初始化QByteArray的一种方法是简单地将const char *传递给它的构造函数。例如:
QByteArray ba("Hello");
size()是5,字节数组也在末尾保留了一个额外的'\0'字符,以便如果使用的函数要求一个指针到基础数据(例如,对data()的调用),指向的数据保证是'\0'--终止。
QByteArray对const char *数据进行深度复制,可以在以后修改它,而不会遇到副作用。如果出于性能原因,不想获取字符数据的深度复制,那么可以使用QByteArray::fromRawData()。
使用resize()设置数组的大小,并按字节初始化数据字节。QByteArray使用基于0的索引,就像c++数组一样。要访问特定索引位置的字节,可以使用操作符[]()。对于非const字节数组,操作符[]()返回一个对可在赋值左侧使用的字节的引用。例如:
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
对于只读访问,另一个语法是使用at():
for (int i = 0; i < ba.size(); ++i)
{
if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
cout << "Found character in range [a-f]" << endl;
}
at()可能比operator[]()快,因为它从不导致深度复制发生。
要一次提取多个字节,可以使用left()、right()或mid()。
QByteArray可以嵌入'\0'字节。size()函数总是返回整个数组的大小,包括嵌入的'\0'字节,但不包括QByteArray添加的终止符'\0'。例如:
QByteArray ba1("ca\0r\0t");
ba1.size(); // Returns 2.
ba1.constData(); // Returns "ca" with terminating \0.
QByteArray ba2("ca\0r\0t", 3);
ba2.size(); // Returns 3.
ba2.constData(); // Returns "ca\0" with terminating \0.
QByteArray ba3("ca\0r\0t", 4);
ba3.size(); // Returns 4.
ba3.constData(); // Returns "ca\0r" with terminating \0.
const char cart[] = {'c', 'a', '\0', 'r', '\0', 't'};
QByteArray ba4(QByteArray::fromRawData(cart, 6));
ba4.size(); // Returns 6.
ba4.constData(); // Returns "ca\0r\0t" without terminating \0.
QByteArray提供了以下用于修改字节数据的基本函数:append()、prepend()、insert()、replace()和remove()
QByteArray x("and");
x.prepend("rock "); // x == "rock and"
x.append(" roll"); // x == "rock and roll"
x.replace(5, 3, "&"); // x == "rock & roll"
从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:
1)转为HEX,用于显示十六进制;
Hex编码转换为char存储到QByteArray
[static] QByteArray QByteArray::fromHex(const QByteArray&hexEncoded)
QByteArray text = QByteArray::fromHex("517420697320677265617421"); text.data(); // returns "Qt is great!"
QByteArray转为Hex编码:
QByteArray QByteArray::toHex() const :
返回字节数组的十六进制编码。十六进制编码使用数字0-9和字母a-f返回字节数组的十六进制编码副本。十六进制编码使用数字0-9和字母a-f。如果分隔符不是'\0',分隔符将插入到十六进制字节之间。
QByteArray QByteArray::toHex(char separator) const
QByteArray macAddress = QByteArray::fromHex("123456abcdef"); macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef" macAddress.toHex(0); // returns "123456abcdef"
2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;
[static] QByteArray QByteArray::number(int n, int base = 10)
int n = 63; QByteArray::number(n); // returns "63" QByteArray::number(n, 16); // returns "3f" QByteArray::number(n, 16).toUpper(); // returns "3F"
3)转为整型、浮点型等数值类型;
int QByteArray::toInt(bool *ok = nullptr, int base = 10) const
如果ok不是nullptr,则ok为false设置失败,ok为true则成功。
QByteArray str("FF"); bool ok; int hex = str.toInt(&ok, 16); // hex == 255, ok == true int dec = str.toInt(&ok, 10); // dec == 0, ok == false 转为十进制失败
4)大小写转换;
通过toUpper()和toLower()方法实现大小写转换
QByteArray x("Qt by THE QT COMPANY"); QByteArray y = x.toLower(); // y == "qt by the qt company" QByteArray x("Qt by THE QT COMPANY"); QByteArray y = x.toUpper(); // y == "QT BY THE QT COMPANY"
5)转为字符串类型;
QByteArray byte; QString str; str = QString(byte);
[static] QByteArray QByteArray::fromBase64(const QByteArray &base64)
返回Base64数组Base64的解码副本。输入不检查有效性;跳过输入中的无效字符,使解码过程可以继续处理后续字符。
QByteArray text = QByteArray::fromBase64("UXQgaXMgZ3JlYXQh"); text.data(); // returns "Qt is great!"
用于解码 Base64 编码数据的算法在 RFC 4648 中定义。