Qt 中TCP/Modebus通讯带符号浮点数Qbytearray相互转化

本文讲述了在工业应用中,如何将带符号浮点数转换为Qbytearray,用于TCP/Modebus协议的数据传输,包括取绝对值、十六进制化、修改符号位等步骤,并解释了逆向转换的过程。
摘要由CSDN通过智能技术生成

带符号浮点数Qbytearray相互转化

 在工业应用中,数据传输十分常见,其中最常见是应用TCP/Modebus协议,将本地数据库中的数据传到其他地方,这里便涉及数据的转化,其中将带符号的浮点数转成指令传输给对方便是本文章的主要内容。
 我们知道,在qbytearray的数据解析中,浮点数float占据四个字节,其中最高位为符号位,那我们在传输过程中,先取其绝对值,转化为十六进制,再根据正负修改最高位,根据这个思路实现其代码。
 第一步,从数据库中取相应的数据
    QSqlQuery query(db);
    QString temSql = "SELECT currdata FROM current_data order by id";
    query.exec(temSql);
    while(query.next())
    {
        curr_data.append(query.value(0).toDouble());
    }

第二步,取绝对值,转化为十六进制

            float ss = fabs(curr_data.at(i));    //取绝对值
            uchar c[4];
            bool ok;

            int a = *((int *)&ss);
            QString float_str = QString("%1").arg(a,4,16,QLatin1Char('0'));
            QString str_spilt;

            qDebug() << float_str ;

            for(int j = 0;  j < 4; j++)
            {
                str_spilt = float_str.mid(j*2, 2);   //隔两个分割
                c[j] = str_spilt.toInt(&ok, 16);
            }

第三步,判断正负,修改最高位

if(curr_data.at(i) < 0)
   c[0] =(c[0] | 0x80);

最后,将uchar数组的值,赋给qbytearray,通过TCP 方式发出去即可。

最后将四字节的qbytearray转化成float

    quint32 data = quint32(byte0 << 24 | byte1 <<16 | byte2 <<8 | byte3 << 0);
    const float *f = reinterpret_cast<const float *>(&data);
    return *f;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值