QT中常见QByteArray,QString,char,10进制,16进制之间转换

  ​QString是专门用来处理字符串的,除了能处理ASCII编码字符,还包括各国语言的编码,默认情况下QString会把所有数据当做utf-8编码来处理。QByteArray只是单纯用来处理数据的,除了能处理ASCII编码字符,其它复杂的编码不能处理,直接以字节流的方式来对待

1:QString转QByteArray

 QString str("123abc这是测试");
 QByteArray byte1 = str.toLatin1(); //按照ASCII编码转换,无法转换中文
 QByteArray byte2 = str.toUtf8();    //按照Utf-8编码转换,可以转换中文
 qDebug() <<  "byte1:" << byte1 << "byte2:" << byte2;
 因为QByteArray只能处理ASCII编码字符,utf-8编码下,一个汉字占三个字节。
输出结果:byte1: "123abc????" byte2: "123abc\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5" 

2:QString字符串转10进制
  使用toInt()函数,第一个参数表示转换发那会状态,第二个参数表示字符串的读取方式,默认是10进制。

分两种情况:
第一种:str="123" 转换成数值123 。str是10进制的字符串
QString hexstr = "123"
bool ok;
int hexnum = hexstr.toInt(&ok,10); // 表示以10进制方式读取字符串
qDebug()<<hexnum<<<endl;   <<输出 hexnum 123

第二种:str="123" 转换成数值123 。str是16进制的字符串

QString hexstr = "123"
bool ok;
int hexnum = hexstr.toInt(&ok,16); // 表示以16进制方式读取字符串
qDebug()<<hexnum<<endl;   <<输出 hexnum 291

3:QString字符串转16进制
QByteArray 里面可以存储16进制数据,所以我们将Qstring字符依次转成QByteArray 即可。这里的字符可以是任何Ascii编码。

也分成两种:
第一种:比如字符串str="1234",直接按照0x12 0x34这样发送出去:12 34
第二种:str="1234" 把每个字符转换成Ascii码的16进制发送:31 32 33 34 

第一种:直接将字符串,按照每两个字符分隔,然后转换成16进制发送。把Qstring类型转成QByteArray ,然后发送出去。
QByteArray MainWindow::GetHexValue(QString str)
{
    QByteArray senddata;
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;
    for(int i=0; i<len; )
    {
        hstr=str[i].toLatin1();
        if(hstr == ' ')
        {
            i++;
            continue;
        }
        i++;
        if(i >= len)
            break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata == 16) || (lowhexdata == 16))
            break;
        else
            hexdata = hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
    }
    senddata.resize(hexdatalen);
    return senddata;
}

char MainWindow::ConvertHexChar(char ch)
{
    if((ch >= '0') && (ch <= '9'))      //限定字符0-9
         return ch-0x30;
    else if((ch >= 'A') && (ch <= 'F')) //限定字符A-F
         return ch-'A'+10;
    else if((ch >= 'a') && (ch <= 'f')) //限定字符a-f
         return ch-'a'+10;
    else return (-1);
}
例子:发送端按照下面形式发送,接收端也要使用16进制接收,就可以实现16进制收发
Qstring  str = "12345678ab";
QByteArray array = GetHexValue(str);

第二种:
第二种方式就是我们常见直接转成ASCII码即可,如果要16进制发送,那就使用tohex()函数转成16进制的ASCII码发送。
   QString str1 = "abc123";
   QByteArray data = str1.toUtf8().toHex();    
   qDebug()<<data<<endl;---------->>输出data:61 62 63 31 32 33
对照ASCII码表如下:

QT中常见QByteArray,QString,char,10进制,16进制之间转换_第1张图片
4:QByteArray转QString

方法一:
QByteArray array;
QString str = QString(array);  >>不能显示中文
需要显示中文的时候:
QString str  = QString::fromLocal8Bit(array);  >>可以显示中文

5:QByteArray转10进制
  因为QByteArray可以存储的字符串分两种,一种是0-9之间的数值字符,这种字符回来你可以使用toint()函数,或者tohex()函数转。另一种就是里面有0-9,a-f,A-F等有字母字符的时候,就不能直接使用toint()函数,会报错。可以先转tohex(),在转toint()。这里的字符串转16进制类型,就是按照转ASCii码的形式转的。在编程中,里面的源码都是按照转ascii来的 ,计算机就认这个,我们前面提到的把“ab”字符串转成16进制数值ab,是我们自己封装出来的函数,达到自己的目的而已。

第一种:QByteArray里面只有数字符号,不带字母或者其他符号
   QByteArray array = "123";
    bool ok;
  qDebug()<<"直接转10进制="<<array.toInt(&ok,10)  <<输出   123
       <<"先转hex,再转int" <<array.toHex().toInt(&ok,16);   <<输出 3224115
      ******123 转ascii== 313233==int==3224115)

第二种:QByteArray带字母或者其他符号,不仅仅是数字字符
   QByteArray array = "1a23";
    bool ok;
  qDebug()<<"有字母a直接转10进制="<<array.toInt(&ok,10)  <<输出  0 转换失败
  <<"先转hex,再转int"<<array.toHex().toInt(&ok,16);     <<输出  828453427
 ******1a23 转ascii== 31613233==int==828453427)

QByteArray中存储的数据形式是关键,10进制在通信过程中用到的概率少,绝大多数时候都是16进制
在这里只是简单的理解下函数的用法

6:QByteArray转16进制
  其实和上面的转10进制方式类似,16进制传输使我们在项目工程中用到最多的,不管是16进制发送还是16进制接收,都要用到转16进制,有时候转不好就会出现一些问题。QByteArray是一个本身就可以存储16进制的,也可以存储字符串等,所以在使用QByteArray转16进制数据的时候,首先得知道QByteArray里面的数据时什么类型。下面就分情况说明一下:

第一种:
发送过来的就是16进制数据,在QByteArray中存储的数据形式如:qbytearray  "\x00\x00\x01\x11"  
这个\x00跟0x00是一个意思。所以直接16进制过来的数据就不需要转换,直接使用即可。
如果看不惯这种格式,可以在后面加一句tohex(),这个tohex()的功能只是把显示的形式改变了
一下,qbytearray  "00000111" 。反正我是习惯上面一种,下面这个容易混淆。

QByteArray RevByteData = serialPort->readAll(); 对方发送的就是16进制数据
RevByteData.toint(&ok,16);1610  等等一些其他的数据处理操作

第二种:
发送过来的是字符串格式,不是16进制数据。分两种,一种是直接将字符串str ="112233aabb"
转换成11,22,33....这样的16进制形式。一种是转成ascii码16进制形式:31 31 32 32 33 33 61 61 ....
转成ASCII码这种就不用累赘说明了,直接tohex()。
另外一种方式:
步骤:先转成QString类型,然后再使用QString转16进制

    QByteArray array = "112233aabb";
    QString str = QString(array);
    QByteArray hex = GetHexValue(str);
    GetHexValue()在前面QString转16进制中有详细说明。

7:其他的一些常用类型转换

(1)QString转char

QString str="abc";
char *ch;
ch = str.toLatin1.data();

(2)char转QString

char a='b';
QString str;
str=QString(a);

(3)QByteArray转char

char *ch;      /   不要定义成ch[n];
QByteArray byte;
ch = byte.data();

(4) char转QByteArray

char *ch;
QByteArray byte;
byte = QByteArray(ch);

(5)int转QString

int a=10;
QString b;
b=QString::number(a)

8:关于显示中文
toLatin1toLocal8Bit,toUtf8都是QString转QByteArray的方法,Latin1代表ASCII,Local8Bit代表unicode,toUtf8将字符串的UTF-8表示形式返回为QByteArray。
UTF-8是一个Unicode编解码器,可以表示Unicode字符串(如QString)中的所有字符。utf-8是在unicode上优化的,简化内存,不浪费内存。

以串口通信为例:
发送中文:
QString str ="发送中文";
ui->seriport.write(str.toUtf8());  把中文字符转成utf-8格式发送出去

接收中文:
QByteArray RevByteData = serialPort->readAll();
QString str  = QString::fromUtf8(RevByteData);   //utf8转中文字符
ui->tEdit_rev->append(str);   //接收字符串,显示中文

toLocal8Bit()fromLocal8Bit()用法一样。

你可能感兴趣的:(QT,qtcreator)