Qt中带符号十进制与两字节十六进制之间的转换

文章介绍了在Qt环境下,如何将带符号的十进制整数转换为两字节的十六进制字符串,以及如何将两字节的十六进制字符串转换回带符号的十进制整数。转换过程涉及QByteArray到QString的转换,以及字符串截取、拼接和数值运算。同时,文章提供了一个例子和改进方法,包括处理非正数的情况以及从字符串中提取并组合16进制数字。

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

带符号十进制与两字节十六进制之间的转换
前言:两者转换一般用在串口通信的数据处理上,上位机接收到QByteArray类型的数据,转成QString类型,然后进行字符串截取拼接,获取数据。因此,下文两字节十六进制的数据类型是QString。十进制各种数据类型转换相对简单。下文带符号十进制数据类型是整型。

QByteArray byte = serial->readAll();
QString qstr = byte.toHex();

例子:0xFD67 和 -665
1、带符号十进制 转 两字节十六进制
复制代码

int main(int argc, char *argv[]){
    int num=-665;//正负皆可
    QString qnum= QString::number(num,16).right(4);//裁剪字符串前面多余的f
    std::cout<<qnum.toUpper().toStdString()<<std::endl;
    return 0;
}

复制代码
输出:FD67
2、两字节十六进制 转 带符号十进制
复制代码

int main(int argc, char *argv[]){
    int num;bool ok;
    QString qnum = "FD67";
    num = qnum.toInt(&ok,16);
    if(!(qnum.at(0)>='0'&&qnum.at(0)<='7')){//非正数
        num = num & 0x7FFF;       //清除符号位
        num = ~num;                      //反码
        num = num & 0x7FFF;        //清除左边多余位
        num = num + 1;                 //加1
        num = num * -1;                //符号位
    }
    std::cout<<num<<std::endl;
    return 0;
}

改进:
获取到的字符串进行分割,比如通过获取四个字符拼接成一个16进制字符串,然后再将hex转为无符号整形和有符号short

QString Hex = QString(str.at(i))+QString(str.at(i+1)) + QString(str.at(i+2)) + QString(str.at(i+3));
int dec = (int16_t)Hex.toInt(0,16);    //将字符串以16进制读入,转为10进制整形
//data +="x:"+QString::number(dec);  //qt将转为无符号整形
data +="x:"+QString::number((int16_t)dec); //Qt中强转获取hex转为有符号shaort   -32768~32768
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值