上位机开发笔记

文章介绍了通过内存强转的方式进行4字节浮点数与16进制之间的转换,包括浮点转16进制、16进制转浮点,以及10进制到16进制的表示。这种方法适用于PLC中的字节序处理,同时提到了QByteArray在处理通讯报文时的应用,以及如何处理Modbus协议中的2字节数据类型。
摘要由CSDN通过智能技术生成

小窍门,4字节浮点数和16进制转换,可以直接使用内存强转,代码简单,效率高。

1、浮点数转为16进制
float f1 = 12.3456f;
uint u1 = (int)(&f1);

2、16进制转为4字节浮点数
uint u2 = u1;
float f21 = (float)(&u2);

3、10进制转为16进制输出
qDebug() << QString(“0x%1”).arg((u2>>24)&0xff, 2, 16) << QString(“0x%1”).arg((u2>>16)&0xff, 2, 16) << QString(“0x%1”).arg((u2>>8)&0xff, 2, 16) << QString(“0x%1”).arg(u2&0xff, 2, 16);

强转的这种字节序,目前PLC中使用的,应该是一样的。
就是高字节在前低字节在后。这样不用根据浮点数的规则去计算符号位、阶码和尾数8字节的双精度和longlong的转换,因为实际使用中很少用到,就没试过。从道理上来讲,应该也是支持类似的强转的。

uint u1 = (uint)(&f1);注意 有符号和无符号的区别 还可以使用显示的转换函数 这种是以前习惯的写法,
定义个联合类型 比如 union a; 里面 一个float 一个uint ,给float赋值,然后直接使用uint就给你自动转换;同理,给uint赋值,float就是你需要的转换结果。
这样也挺简单
其实是同样的道理,4字节的内存强制转换

还有 QByteArray,这里边存的是 char
提取的时候,也是可以强转
uint u = (uchar(ba[0]) <<24) + (uchar(ba[1]) <<16) + (uchar(ba[2]) <<8) + (uchar(ba[3]))
这样就可以把通讯报文获取的缓冲区报文 转换为 uint值 进一步可强转转换为 整数或小数。
另外 plc的modbus 有的数据类型是 2字节的 就 high<<8 + low 就可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值