在串口通信中,常常使用QByetArray储存数据,QByteArray可以看成字节数组,每个索引位置储存一个字节也就是8位的数据,可以储存两位16进制数,可以用uint8取其中的数值。
QString转16进制QByteArry
{
QString source = "01 2b a3";
QStringList list = source.split(' ');
QByteArray ba;
for(auto str:list){
int num = str.toInt(NULL, 16);//转换成数值,按照16进制
ba.append(num);
}
quint8 i1 = ba[0];
quint8 i2 = ba[1];
quint8 i3 = ba[2];
qDebug()<<i1<<' '<<i2<<' '<<i3<<endl;
}
输出
1 43 163
16进制QByteArray转QString
{
QByteArray ba;
data.append(0xaa);//或者ba.append(170);
data.append(0xbb);//或者ba.append(187);
data.append(0x03);//或者ba.append(3);
//QByteArray转qstring
QString str;
for(int i=0;i<ba.size();i++){
quint8 i8= ba[i];//ba数据可以表示负数,首先转化成正数quint8
str += QString("%1 ").arg(i8,2,16,QLatin1Char('0'));
}
qDebug()<<str<<endl;
}
输出
"aa bb 03 "
QByteArray16进制数拼接
假设QByteArray中array[0]是0xaa,array[1]是0xbb,array[2]是0x03,这样代表0xaabb03,解析办法
{
QByteArray data;
data.append(0xaa);
data.append(0xbb);
data.append(0x03);
quint32 aa = quint8(data[0])*0x10000;//32位int储存24位数据
quint16 bb = quint8(data[1])*0x100;//16位数据
quint8 cc = quint8(data[2]);//8位数据
quint32 tot = aa+bb+cc;
qDebug()<<QString::number( tot,10);
qDebug()<<QString::number( tot,16);
}
输出:
"11188995"
"aabb03"
关于为什么使用quint8()先对QBytearray数据进行转化,由于QByetearray可以储存负数,16进制的0xaa可以是10进制的-86也可以是170

因此直接赋值会导致高位全为F,aa变成4 289 331 200,也就是16进制的FFAA 0000
所以要先转化为uint8。这样aa就是1 141 120,00AA 0000
另一种方法
{
QByteArray data;
data.append(0xaa);
data.append(0xbb);
data.append(0x03);
quint32 aa = quint8(data[0])<<16;//移位4位等于乘0x10,移位16位,相当于乘0x10000
quint16 bb = quint8(data[1])<<8;//移位8位
quint8 cc = quint8(data[2]);
quint32 tot = aa|bb|cc;
qDebug()<<QString::number( tot,10);
qDebug()<<QString::number( tot,16);
}
Qt16进制与10进制的转化
一、16进制转10进制
1、数字转换为字符串
quint8 Hex = 0x0F;
QString num = QString("%1").arg(Hex,0,10);
//QString num = QString::number(Hex,10);
2、数字转换为数字
quint8 Hex = 0x0F;
QString num = QString("%1").arg(Hex,0,10);
//QString num = QString::number(Hex,10);
int dec = num.toInt();
3、字符串转换为数字
4、字符串转换为字符串
QString Hex = "0x0F";
bool ok;
int dec = Hex.toInt(&ok,16);
QString num = QString("%1").arg(dec,0,10);
//QString num = QString::number(dec,10);
二、10进制转换16进制。
1、数字转换为字符串
2、数字转换为数字
3、字符串转换为数字
4、字符串转换为字符串