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码表如下:
方法一:
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);16转10 等等一些其他的数据处理操作
第二种:
发送过来的是字符串格式,不是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:关于显示中文
toLatin1
、toLocal8Bit
,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()用法一样。