提示:至目前版本 QT (5.14)中,QByteArray 支持的基础数据类型多为 char
前言
QT 对于文件、设备、通讯端口之类的数据交换,采用 QByteArray 类进行,所以在嵌入式开发中经常操作该类以获取或设置数据,本文总结该类的使用。
一、将16进数(HEX)转换为 Char,生成新的 QByteArray
提示:单个字符的标识为:char ch = ‘\xab’;
注意:‘\xff’ 在QT内为16进制原数的合法表述,但其数值对 char 类型来说已经超范围了
1. 采用构造函数生成
static const char ch0 = '\xab';
QByteArray byteAry0(&ch0);
qDebug() << "byte array 0 is:" << byteAry0; // ret 0xAB
static const char ch1[] = {'\xff', '\x33', '\x56', '\xab'};
QByteArray byteAry1(ch1);
qDebug() << "byte array 1 is:" << byteAry1; // ret 0xff...
2. 采用系统提供静态函数生成
static const char ch2[] = {
'\x00', '\x00', '\x03', '\x84', '\x78', '\x9c', '\x3b', '\x76',
'\xec', '\x18', '\xc3', '\x31', '\x0a', '\xf1', '\xcc', '\x99',
'\x6d', '\x5b'
};
QByteArray byteAry2 = QByteArray::fromRawData(ch2, sizeof(ch2));
qDebug() << "byte array 2 is:" << byteAry2; // ret 0x00 00 03 84..
将基础数据转化为 QByteArray 后,在后续QT的处理中,很少再需要转换回字符串数组进行运算,有时会转换为 qint32 等数值型进行运算。
二、将字符串转化为 QByteArray
1. 采用系统提供的静态函数生成
QByteArray byteAry3 = QByteArray::fromHex("abccddff");
qDebug() << "byte array 3 is:" << byteAry3; // ret 0xAB CC DD..
三、其它类型不能直接生成 QByteArray
1. 其它类型变量可以靠赋值转换
uint8_t num4 = 0xff;
static const char ch4 = ~num4 + 1;
QByteArray byteAry4(&ch4);
qDebug() << "byte array 4 is:" << byteAry4; // ret 0x01
uint16_t num5 = 16;
static const char ch5 = num5;
QByteArray byteAry5(&ch5);
qDebug() << "byte array 5 is:" << byteAry5; // ret 0x10
赋值所带来的隐形强制类型转换将被体现出来
2. 直接赋值转换
static const char ch6 = 250;
QByteArray byteAry6(&ch6);
qDebug() << "byte array 6 is:" << byteAry6; // ret 0xFA
数值将能够超过 char 类型本身所代表的 -127 to 128 限制,直接以16进制原始状态写入内存
3. 依靠指针转换
借助强制类型转换符 reinterpret_caset 也可以用指针转换的方式将数值转为 char* 类型后,再送入 QByteArray 对象,其中 reinterpret 原型如下: reinterpret_cast (expression)
但该方式用起来并不方便,在测试后并不推荐该方式,也将不做记录。
总结
后续进一步总结。