小窍门,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 就可以