QString专门用于处理字符串,除了包含ASCII编码字符外,还包含各国语言编码。 缺省情况下,QString将所有数据视为utf-8编码。 QByteArray只是用于处理数据,不仅可以处理ASCII编码字符,而且不能处理其他复杂编码,被视为字节流
1:QString转QByteArray
qstringstr('123ABC这是测试); QByteArray byte1=str.toLatin1 (; 根据ASCII编码转换,中文q字节2=str.to utf8 (; 根据Utf-8编码转换,中文qDebug () byte1: ) byte1) byte23360 ) byte 2; QByteArray只能处理ASCII编码字符,因此在utf-8编码中,一个汉字占三个字节。 输出结果:byte1: '123abc? 什么事? ' byte 23360123 ABCxe5xb0x8fxe9xa9xacxe5x93xa5 ' http://ww.Sina.com /
使用toInt ()函数时,第一个参数表示转换提交的状态,第二个参数表示如何读取字符串,默认值为十进制。
分为两种情况。 第一,将str='123 '转换为数值123。 str是十进制字符串QString hexstr='123'bool ok; inthexnum=Hexstr.toint(ok,10 ); //字符串qDebug )表示以十进制读取hexnumendl; 输出hexnum 123第二类:将str='123 '转换为数值123。 str是十六进制字符串QString hexstr='123'bool ok; inthexnum=Hexstr.toint(ok,16 ); //字符串qDebug )表示以十六进制格式读取hexnumendl的输出hexnum 291 2:QString字符串转10进制
QByteArray可以存储十六进制数据,因此只要将Qstring字符依次转换为QByteArray即可。 这里的字符可以是任意的Ascii码。
分为两部分。 第一个,例如字符串str='12 34 ',直接像0x120x34那样发送。 1234第二,str='1234 '用将各字符转换为ascii码的十六进制格式发送。 31 32 33 34第一个,按两个字符分隔字符串,每12个字符转换一次。将Qstring类型转换为QByteArray并发送。 qbytearraymainwindow :3360 get hex value (qstring str ) { QByteArray senddata; int hexdata、lowhexdata; int hexdatalen=0; int len=str.length (; senddata.resize(Len/2 ); char lstr、hstr; for(intI=0; ilen; ({ hstr=str[i].toLatin1 ); if(hstr==' ' ) I; 继续; (I; if(I=len ) break; lstr=str[i].toLatin1 (; hex data=转换hexchar (hstr ); lowhexdata=converthexchar(lstr; if () hexdata==16 )lowhexdata==16 ) ) break; elsehexdata=hex data * 16 lowhexdata; I; 发送数据[ hex datalen ]=(char ) hex数据; hexdatalen; }senddata.resize(HEXdatalen ); 返回发送数据; } char main window :3360转换器hexchar (charch ) if ) ch='9' ) ch='9' ) /修饰字符0-9返回ch-0x 30; elseif () ch='F ' ) ch='F ' ) ) /修饰字符a-f返回ch-' a ' 10; elseif((ch='a ' ) ) )。
amp;& (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码表如下:
4:QByteArray转QString
5:QByteArray转10进制
因为QByteArray可以存储的字符串分两种,一种是0-9之间的数值字符,这种字符回来你可以使用toint()函数,或者tohex()函数转。另一种就是里面有0-9,a-f,A-F等有字母字符的时候,就不能直接使用toint()函数,会报错。可以先转tohex(),在转toint()。这里的字符串转16进制类型,就是按照转ASCii码的形式转的。在编程中,里面的源码都是按照转ascii来的 ,计算机就认这个,我们前面提到的把“ab”字符串转成16进制数值ab,是我们自己封装出来的函数,达到自己的目的而已。
6:QByteArray转16进制
其实和上面的转10进制方式类似,16进制传输使我们在项目工程中用到最多的,不管是16进制发送还是16进制接收,都要用到转16进制,有时候转不好就会出现一些问题。QByteArray是一个本身就可以存储16进制的,也可以存储字符串等,所以在使用QByteArray转16进制数据的时候,首先得知道QByteArray里面的数据时什么类型。下面就分情况说明一下:
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上优化的,简化内存,不浪费内存。