字符串与16进制转化

在QT软件开发中,处理电表6字节16进制地址时,需要进行字符串与16进制之间的转换。本文介绍了使用QString的arg()方法将16进制转换为字符串,并展示了如何利用mid()函数处理字符串,将其转换回16进制,同时确保输入地址始终为12位,以避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  鄙人在学习QT软件编写上位机的过程中,电表的地址为6个16进制的字节,需要用上位机进行操作更改。


 16进制转 字符串的代码如下:


  QString str;
          for(int i =0;i<6;i++)
           {
               str += QString("%1").arg(stru.protocol.dlt645.addr[i], 2, 16, QChar('0'));
           }
  其中,addr[i]  为从下位机读到的地址,2代表宽度,16代表16进制数据,

QString QString::arg(inta,intfieldWidth = 0,intbase = 10,QCharfillChar = QLatin1Char( ' ' )) const

If fillChar is '0' (the number 0, ASCII 48), the locale's zero is used. For negative numbers, zero padding might appear before the minus sign.


字符串转16进制如下:

因为上位机输入的是地址连续的字符串,没有任何断点(split)不能用,只能用mid  来实现,获得每两个字节,然后再转到16进制数据通过串口输出。 mid的字节从0开始数(代表1)。

 QString str = ui->tableWidget->item(iRow,4)->text();
  QString addr0,addr1,addr2,addr3,addr4,addr5;

            addr0 = str.mid(0,2);
            addr1 = str.mid(2,2);
            addr2 = str.mid(4,2);
            addr3 = str.mid(6,2);
            addr4 = str.mid(8,2);
            addr5 = str.mid(10,2);
            stru.protocol.dlt645.addr[0]=addr0.toInt(0,16);
            stru.protocol.dlt645.addr[1]=addr1.toInt(0,16);
            stru.protocol.dlt645.addr[2]=addr2.toInt(0,16);
            stru.protocol.dlt645.addr[3]=addr3.toInt(0,16);
            stru.protocol.dlt645.addr[4]=addr4.toInt(0,16);
            stru.protocol.dlt645.addr[5]=addr5.toInt(0,16);
 
 
 
 
 

为保证每次更改地址时,每次输入的地址必须为12位,做了一个比较Low警告处理,如下:


  if(str.size() == 12)
         {
            QString addr0,addr1,addr2,addr3,addr4,addr5;
            addr0 = str.mid(0,2);
            addr1 = str.mid(2,2);
            addr2 = str.mid(4,2);
            addr3 = str.mid(6,2);
            addr4 = str.mid(8,2);
            addr5 = str.mid(10,2);
            stru.protocol.dlt645.addr[0]=addr0.toInt(0,16);
            stru.protocol.dlt645.addr[1]=addr1.toInt(0,16);
            stru.protocol.dlt645.addr[2]=addr2.toInt(0,16);
            stru.protocol.dlt645.addr[3]=addr3.toInt(0,16);
            stru.protocol.dlt645.addr[4]=addr4.toInt(0,16);
            stru.protocol.dlt645.addr[5]=addr5.toInt(0,16);
         }
         else
         {
             QMessageBox::warning(this,tr("警告"),tr("电表的地址为12位!请正确输入"));
                     return;
         }

这样只要输入的超过12位或不足12位,都需要重新设置地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值