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

更新时间:2023-07-08 14:21:23 阅读: 评论:0

QT中常见QByteArray,QString,char,10进制,16进制之间转换
  ​Q String是专门⽤来处理字符串的,除了能处理ASCII编码字符,还包括各国语⾔的编码,默认情况下QString会把所有数据当做utf-8编码来处理。QByteArray只是单纯⽤来处理数据的,除了能处理ASCII编码字符,其它复杂的编码不能处理,直接以字节流的⽅式来对待
1:QString转QByteArray
QString str("123abc这是测试");
QByteArray byte1 = Latin1();//按照ASCII编码转换,⽆法转换中⽂
QByteArray byte2 = Utf8();//按照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 = Int(&ok,10);// 表⽰以10进制⽅式读取字符串
qDebug()<<hexnum<<<endl;<<;输出 hexnum 123
第⼆种:str="123"转换成数值123。str是16进制的字符串
QString hexstr ="123"
bool ok;
int hexnum = Int(&ok,16);// 表⽰以16进制⽅式读取字符串
qDebug()<<hexnum<<endl;<<;输出 hexnum 291
3:QString字符串转16进制
QByteArray ⾥⾯可以存储16进制数据,所以我们将Qstring字符依次转成QByteArray 即可。这⾥的字符可以是任何Ascii编码。
也分成两种:
第⼀种:⽐如字符串str="1234",直接按照0x120x34这样发送出去:1234
第⼆种:str="1234"把每个字符转换成Ascii码的16进制发送:31323334
第⼀种:直接将字符串,按照每两个字符分隔,然后转换成16进制发送。把Qstring类型转成QByteArray ,然后发送出去。QByteArray MainWindow::GetHexValue(QString str)
{
QByteArray nddata;
int hexdata,lowhexdata;
int hexdatalen =0;
int len = str.length();
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;
el
hexdata = hexdata*16+lowhexdata;
i++;
nddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
return nddata;
}
char MainWindow::ConvertHexChar(char ch)
{
if((ch >='0')&&(ch <='9'))//限定字符0-9
return ch-0x30;
el if((ch >='A')&&(ch <='F'))//限定字符A-F
return ch-'A'+10;
el if((ch >='a')&&(ch <='f'))//限定字符a-f
return ch-'a'+10;
el return(-1);
}
例⼦:发送端按照下⾯形式发送,接收端也要使⽤16进制接收,就可以实现16进制收发
Qstring  str ="12345678ab";
QByteArray array =GetHexValue(str);
第⼆种:
第⼆种⽅式就是我们常见直接转成ASCII码即可,如果要16进制发送,那就使⽤tohex()函数转成16进制的ASCII码发送。  QString str1 ="abc123";
控制的意思QByteArray data = Utf8().toHex();
qDebug()<<data<<endl;---------->>输出data:616263313233
对照ASCII码表如下:
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";
4CSbool ok;
qDebug()<<"直接转10进制="<&Int(&ok,10)<<;输出123
<<"先转hex,再转int"<&Hex().toInt(&ok,16);<<;输出3224115
******(123转ascii==313233==转int==3224115)
第⼆种:QByteArray带字母或者其他符号,不仅仅是数字字符
玫瑰精
QByteArray array ="1a23";
bool ok;
qDebug()<<"有字母a直接转10进制="<&Int(&ok,10)<<;输出0转换失败
<<"先转hex,再转int"<&Hex().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 = rialPort->readAll();对⽅发送的就是16进制数据
第⼆种:
发送过来的是字符串格式,不是16进制数据。分两种,⼀种是直接将字符串str ="112233aabb"
转换成11,这样的16进制形式。⼀种是转成ascii码16进制形式:
转成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 = Latin1.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->riport.Utf8());把中⽂字符转成utf-8格式发送出去
接收中⽂:
QByteArray RevByteData = rialPort->readAll();
QString str  = QString::fromUtf8(RevByteData);//utf8转中⽂字符
ui->tEdit_rev->append(str);//接收字符串,显⽰中⽂
toLocal8Bit()和fromLocal8Bit()⽤法⼀样。

本文发布于:2023-07-08 14:21:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1085626.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进制   字符   字符串   编码   转换   发送
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图