QString字符串与16进制QByteArray的转化,QByteArray16进制数字组合拼接,Qt16进制与10进制的转化

⌚Time: 2023-08-08 19:17:05

👨‍💻Author: Jack Ge

在串口通信中,常常使用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、字符串转换为数字


     QString Hex = "0x0F";

     bool ok;

     int dec = Hex.toInt(&ok,16);    //以16进制读入

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、数字转换为字符串




     int dec = 15;

     QString num = QString("%1").arg(dec,0,16);

     //QString num = QString::number(dec,16);

2、数字转换为数字


     QByteArray ba;

     int dec = 15;

     ba.setNum(dec,16);

3、字符串转换为数字


     QByteArray ba;

     QString dec = "15";

     ba.setNum(dec.toInt(),16);

4、字符串转换为字符串


     QString dec = "15";

     //QString num = QString("%1").arg(dec.toInt(),0,16);

     QString num = QString::number(dec.toInt(),16);