QT QString和十六进制数值字符串、QByteArray和十六进制数值字符串之间的转换,Qt写电脑与单片机串口通讯用

常用数据

2020.12.31 更新

0特殊的十六进制


1.十六进制数值转字符

1.1 0x31变为"31"

1.1.1 QByteArray原数据

//QByteArray转十六进制格式显示"1">>"31"   0x06>>"06"  10>>"0A"
QByteArray data;
QString ret(data.toHex().toUpper());//toUpper()大写
QString ret(data.toHex());
QString MainWindow::ByteArrayToHexString(QByteArray data){
    QString ret(data.toHex().toUpper());int len = ret.length()/2;//插入空格
for(int i=1;i<len;i++)
{
    ret.insert(2*i+i-1," ");
}
return ret;

1.1.2 int或char等常见数值

int data=1512;  //"05e8"
QString strsend48503=QString("%1").arg(data,4,16,QLatin1Char('0'));//int型或char型都可
data,//原数据
4,   //一共要多少字符
16,  //数据进制
QLatin1Char('0')//左侧不足位补什么字符  
    
    方法2
  int m=0x31;
  QString string;
  string=QString::number(m,16);//31

1.2 0x31变为"1"

1.2.1 QByteArray原数据

  QByteArray byte;
  byte.resize(2);
  byte[0]=0x31;
  byte[1]=0x32;
  QString string =byte;   // string="12"

1.2.2 int或char等常见数值

  int m=0x31;
  QString string;
  string[0]=m;
  qDebug()<<string;  //"1"
  char ms[]={0x31,0x31,0x31,0x31,0x31};
  string=ms;
  qDebug()<<string; //"11111"

2十六进制字符转数值

2.1 "31"变为0x31

2.1.1 QByteArray原数据

先转为Qstring吧   
或者用于计算的话可以直接使用QByteArray计算,使用数组索引的方式QByteArray与普通char一样用
  char ch=0x0C;
  QByteArray string;
  string.resize(5);
  string[0]=0x01;    //01
  string[1]=ch;      //0C
  string[2]=++ch;    //0D
  string[3]=ch&0xF0; //00
  string[4]=ch|0xF0; //FD
  qDebug()<<string.toHex().toUpper();  //"010C0D00FD"

2.1.2 QString

这个比较麻烦,只能用逐个字节比对的方式

/*
描述:把两个十六进制字符一个十六进制字节
'a','A'>>0xAA 
*/
char charToHex(char H,char L)
{
  if((H >= '0') && (H <= '9'))
    H-='0';
  else if((H >= 'A') && (H <= 'F'))
    H=H-'A'+10;
  else H='*';

  if((L >= '0') && (L <= '9'))
    L-='0';
  else if((L >= 'A') && (L <= 'F'))
    L=L-'A'+10;
  else L='*';
  return ((H&0x0F)<<4)|(L&0x0F);
}
/*
描述:把一个十六进制字符串转化为十六进制数数组
"01 15 26 581512">>{0x01,0x15,0x26,0x58,0x15,0x12}
*/
 char* dataTypeConversion::hexStr_To_Hexchar(QString data)
{   //"19885984ac418df"
   static char re[200];
   for(int re_num=0;re_num<200;re_num++)
     {re[re_num]=0;}
   int Lenth,cnt=0;
   data.remove(' ');    //删除字符串中的空格
   data=data.toUpper();
   Lenth=data.length();   //获取长度
   if(Lenth%2==1)
     {
       data+="0";
       Lenth++;
     }
   std::string ch = data.toStdString();
   const char*p = ch.c_str();
   char high = 0, low = 0;
   int i=0;
      for (cnt=0; cnt<Lenth; cnt+=2)
      {

          high = p[cnt];
          low = p[cnt+1];
          re[i++]=charToHex(high,low);
      }
      return re;
}

2.2 "1"变为0x31

2.2.1 QByteArray原数据

QString ret(data.toHex().toUpper());//转为16进制大写  QByteArray.toHex()    转为十六进制字符 '1'>>"31"
/*
描述:把一个十六进制字符串转化为十六进制数数组
"123456">>{0x31,0x32,0x33,0x34,0x35,0x36}
*/
//mode  :2显示0x 0:显示空格
QString dataTypeConversion::strToHexstr(QByteArray data,int mode)
{
  QString ret(data.toHex().toUpper());//转为16进制大写  QByteArray.toHex()    转为十六进制字符 '1'>>"31"
  int len = ret.length()/2;
  if(mode==2)
    {
      ret.insert(0,"0X");
      for(int i=1;i<len;i++)
        {
          ret.insert(4*i+i-1,",0X");//编写格式
        }
    }
  else {
      for(int i=1;i<len;i++)
        {
          ret.insert(2*i+i-1," ");//编写格式
        }
    }
  return ret;
}

2.2.2 QString

数值上直接把QString作为数组计算即可

1.数据类型转化

1.1QByteArray

1.1.1 QByteArray>>QString

  QByteArray bytes("hello world汉字");
  QString string = bytes;   //方法1   直接等于
  qDebug()<<string;
  string = QString(bytes);   //方法2用构造函数
  qDebug()<<string;
  string.prepend(bytes);   //方法3 拼接      三种方法效果除拼接功能外数据一样,汉字显示正常
  qDebug()<<string;
//对于本地化编码的字符串,可以用 QString::fromLocal8Bit 函数将字符串源转为 QString 对象;对于 UTF-8 编码的字符串,可以用 QString::fromUtf8 函数实现转换。如果要反过来转换,就 用对应的 to*** 函数。通常情况下有这些函数就够用了。

1.1.2QByteArray>>String

QString string;
std::string str;
str = string.toStdString();

1.1.3QByteArray>>char *

char *ch;         //不能定义成ch[n],数组和指针不一样;
QByteArray byte;
ch = byte.data();

1.1.4QByteArray>>unsigned char*(无变化字符)

1.1.5QByteArray>>unsigned char*(十六进制字符)

1.1.6QByteArray>>int

  QByteArray bytes("1234");
  bool ok;  //转换成功为真
  int string = bytes.toInt(&ok,10);//1234

  bytes=("1A");      
  bytes.toInt(&ok,10);//错误

  bytes=("1A");     
  bytes.toInt(&ok,16); //26

1.2QString

1.2.1QString >>QByteArray

QString str("hello");  
QByteArray bytes = str.toUtf8(); // QString转QByteArray方法1 
QString str("hello");  
QByteArray bytes = str.toLatin1();  // QString转QByteArray方法2

1.2.2QString >>String

QString string;
std::string str;
str = string.toStdString();

1.2.3QString >>char *

QString string;
char *ch;
ch = string.toLatin1.data();

1.2.4QString >>unsigned char*(无变化字符)

1.2.5QString >>unsigned char*(十六进制字符)


1.2.6QString >>int

  QString string="FFAB";
  bool ok;
  int uch = string.toInt(&ok, 16);//十六进制FFAB=十进制65451   打印显示65451
  string="1234";
  uch = string.toInt(&ok, 10)+5;//转换结果为1234   加入一个计算得1239
//第二个参数是进制
基本类型Qt别称转入函数转出函数描述
shortqint16arg或setNumtoShort2 字节长度,有符号短整型。
unsigned shortushort、quint16arg或setNumtoUShort2 字节长度,无符号短整型。
intqint32arg或setNumtoInt4 字节长度,有符号整型。
unsigned intuint、quint32arg或setNumtoUInt4 字节长度,无符号整型。
longarg或setNumtoLong有符号长整型,对于 32 位编程 long 是 4 字节长度,对于 64 位编程是 8 字节长度。
unsigned longulongarg或setNumtoULong无符号长整型,对于 32 位编程 unsigned long 是 4 字节长度,对于 64 位编程是 8 字节长度。
long longqlonglong、qint64arg或setNumtoLongLong8 字节长度,有符号长长整型。
unsigned long longqulonglong、quint64arg或setNumtoULongLong8 字节长度,无符号长长整型。
float默认情况下无arg或setNumtoFloat4 字节长度,单精度浮点数。
double默认情况对应 qrealarg或setNumtoDouble8 字节长度,双精度浮点数。

1.3String

1.3.1String>>QByteArray

1.3.2String>>QString

1.3.3String>>char *

1.3.4String>>unsigned char*(无变化字符)

1.3.5String>>unsigned char*(十六进制字符)

1.3.6String>>int


1.4char *

1.2.1char *>>QByteArray

  char *ch="145aBc汉字";
  QByteArray byte;
  byte = QByteArray(ch);  //显示"145aBc\xE6\xB1\x89\xE5\xAD\x97"

1.2.2QString

  char *ch="145aBc汉字";
  QString string= QString(QLatin1String(ch));//"145aBc?±\u0089?\u00AD\u0097"

1.2.2String

1.2.4unsigned char*(无变化字符)

1.2.5unsigned char*(十六进制字符)

1.2.6int

1.5unsigned char*(无变化字符)

1.2.1QByteArray

1.2.2QString

unsigned char uch;

QString string = QString::number(uch,16);

1.2.2String

1.2.4char*(无变化字符)

1.2.5unsigned char*(十六进制字符)

1.2.6int

1.6unsigned char*(十六进制字符)

1.7int

1.7.1 int>>QByteArray

/*int转QByteArray
1584转为 0x15,0x84*/
QByteArray  dataTypeConversion::intToByte(int i)
{
    QString intToQString=QString("%1").arg(i,4,16,QLatin1Char('0'));
    //qDebug()<<intToQString;
    QByteArray QStringTovalueQByte = intToQString.toLocal8Bit();
    QByteArray valueQByteToHex = QByteArray::fromHex(QStringTovalueQByte);
    //qDebug()<<valueQByteToHex.toHex();
    return valueQByteToHex;
}

1.7.1.1字符串形式

QByteArray arr;
    arr+="//串口配置\r\n";
    arr+=QString("comboBoxBaud=%1\r\n").arg(12);

1.7.1.2数值形式

1.2 数值

1.2.1 int转十六进制字符

QString strsend48503=QString("%1").arg(ui->spinBox_485_03IDAddr->value(),4,16,QLatin1Char('0'));//int型或char型都可

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值