今天调试一台设备时,在交互的Modbus协议中,设定数值位用的是浮点数。

带过那么多学生,我竟然脑袋一空??!

Modbus用浮点型?
浮点型与U32互转?

于是硬着头皮,重新把这块的内容,复盘了一遍~~现在整理笔记,分享给大家。

明天可能会依据这个出个QT的demo,需要的可以一蹲!

一、浮点数与16进制的转化概念

对于一个32位的浮点数中,有以下三个部分组成:符号位、阶码和尾数。具体格式如下:

对各部分解释如下:

S:浮点数的符号位,1 位。0表示正数,1表示负数。M:尾数,23位。用小数表示,小数点在尾数域前面。E:阶码,采用移码方式来表示。

作用:移码方法对两个指数大小的比较和对阶操作都比较方便,因为阶码域值大者其指数值也大。

采用移码方法时,需要将浮点数的指数真值e变成阶码E,变换方法是将指数 e 加上一个固定的偏移值127(01111111),即 E=e+127

浮点数的真值x计算格式为:x = (-1)^s × (1.M) × 2^e32位浮点数e=E-127;64位浮点数e = E-1023简单举几个例子:例题1. 若浮点数x的二进制存储格式为(41360000)16进制,求其32位浮点数的值。
将16进制数转换为2进制 0100 0001 0011 0110 0000 0000 0000 0000
则e = 10000010 - 01111111 = 3(十进制)
M = 01101100000000000000000
则x = (-1)^0 × 1.011011× 2^3 = 1011.011(2进制)
= 11.375(十进制)例题2.    将十进制数20.59375转换成32位浮点数。首先分别将整数和分数部分转换成二进制数:20.59375=10100.10011然后移动小数点,使其在第1,2位之间10100.10011=1.010010011 × 2^4   e=4于是得到:S=0,E=4+127=131,M=010010011最后得到32位浮点数的二进制存储格式为:0100 0001 1010 0100 1100 0000 0000 0000=41A4C000(16进制)

二、浮点数与16进制的转化概念

以QT编译器为例,C/C++针对float浮点型与16进制转换的实现如下:

#include <stdio.h>
float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数
{//      char cByte[4];//方法一
//     for (int i=0;i<num;i++)
//     {//     cByte[i] = Byte[i];
//     }
//     float pfValue=*(float*)&cByte;
//return  pfValue;return *((float*)Byte);//方法二
}
​
long FloatTohex(float f_tohex)//浮点数到十六进制转换1
{return *( long *)&f_tohex;
}
​
void FloatToByte(float floatNum,unsigned char* byteArry)/*浮点数到十六进制转换2*/
{char* pchar=(char*)&floatNum;for(int i=0;i<sizeof(float);i++){*byteArry=*pchar;pchar++;byteArry++;}
}
​
int main(int argc, char *argv[])
{unsigned char floatToHex[4];uint32_t float_32;uint8_t u8_f32[4];
​unsigned    char hexbyte[4]={0xcd,0xCC,0xCC,0x3D};//传输数据为3d cc cc cdfloat Hdecimal=0.0;float flh=2.0;
​Hdecimal=Hex_To_Decimal(hexbyte,sizeof(hexbyte));//十六进制转换为浮点数
//    printf("\n 浮点数为:\n %f\n",Hdecimal);qDebug()<<QString(" 浮点数为:%1").arg(Hdecimal);
​long hX=FloatTohex(Hdecimal);//浮点数转换为十六进制一
//    printf("\n正序十六进制值:\n %f=%X \n",Hdecimal,hX);//正序显示qDebug()<<QString(" 正序十六进制值:%1 => %2").arg(hX).arg(Hdecimal);
​FloatToByte(Hdecimal,floatToHex);//浮点数转为十六进制二
//    printf("\n倒序十六进制:\n%f=%x %x %x %x\n",Hdecimal,floatToHex[0],floatToHex[1],floatToHex[2],floatToHex[3] );//倒序显示qDebug()<<QString(" 倒序十六进制:%1=%2 %3 %4 %5").arg(Hdecimal).arg(QString::number(floatToHex[0], 16).toUpper()).arg(QString::number(floatToHex[1], 16).toUpper()).arg(QString::number(floatToHex[2], 16).toUpper()).arg(QString::number(floatToHex[3], 16).toUpper());FloatToByte(flh,floatToHex);//浮点数转为十六进制二qDebug()<<QString(" 倒序十六进制:%1=%2 %3 %4 %5").arg(flh).arg(QString::number(floatToHex[0], 16).toUpper()).arg(QString::number(floatToHex[1], 16).toUpper()).arg(QString::number(floatToHex[2], 16).toUpper()).arg(QString::number(floatToHex[3], 16).toUpper());qDebug()<<QString(" 正序十六进制:%1=%2 %3 %4 %5").arg(flh).arg(QString::number(floatToHex[3], 16).toUpper()).arg(QString::number(floatToHex[2], 16).toUpper()).arg(QString::number(floatToHex[1], 16).toUpper()).arg(QString::number(floatToHex[0], 16).toUpper());
}

PS:以上代码,只简单例举了浮点型与16进制的转换,那么浮点型和U32的转换,你能举一反三实现出来吗?

明天会发一个基于QT的demo进行揭晓哟!欢迎一蹲!

小编想说:
​新号初建,如果对你有所帮助的话,给我点个小心心吧!欢迎分享给更多的人~
ღ( ´・ᴗ・` )比心~~

ReadMe:
2022-10-08修改日志:
修改初版的小bug,16进制转float数组处理逆序。

浮点数与32位16进制互转(有代码)相关推荐

  1. 生成32位,16进制的UUID

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 32位16进制转换为10进制数

    public class Trans2Ten { public static void main(String[] args) {   long l = sixteen2ten("11e1- ...

  3. 8位16进制频率计设计实验--VHDL

    一.实验目的 (1)学习并掌握Quartus II的使用方法 (2)学习简单时序电路的设计和硬件测试. (3)学习使用VHDL 语言方法进行逻辑设计输入 (4)学习设计8位16进制频率计,学习较复杂的 ...

  4. LeetCode 271. 字符串的编码与解码(4位16进制字符+字符串)

    文章目录 1. 题目 2. 解题 1. 题目 请你设计一个算法,可以将一个 字符串列表 编码成为一个 字符串. 这个编码后的字符串是可以通过网络进行高效传送的,并且可以在接收端被解码回原来的字符串列表 ...

  5. 踩坑~CSS~8 位16 进制颜色

    踩坑-CSS-8 位16 进制颜色 背景 初步结论 网页颜色 16 进制数字表示方法 十进制"函数"表示 支持度与最终结论 背景 我在开发 webview 环境下的 H5 小应用( ...

  6. python十进制单精度浮点(float)转16位16进制(FP16 hex)

    python十进制单精度浮点(float)转16位16进制(FP16 hex) 目的 将神经网络权重存放到FPGA内部需要将可训练参数从float转换到FP16 hex. Code # tt.py i ...

  7. java16进制取前几位_16位16进制数怎么取前8位和后8位

    展开全部 我用C语言来回答这个问题.16位就是一个2字节整636f707962616964757a686964616f31333433633530数. unsigned short hex=0x123 ...

  8. java进制转换、字符串与16进制互转/数字进制互转

    目录 十进制转其他进制 其他进制数字转十进制 字符串与16进制相互转换 十进制转其他进制 /*** 十进制转其他进制*/public static String conversion(Integer ...

  9. java 中 10进制 转为 4位 或者8位 16进制数

    int i =789; //输出为16进制数 Integer.toHexString(), String s=Integer.toHexString(Integer.valueOf(value)); ...

最新文章

  1. 牛津大学名誉教授Colin Blakemore:大脑是如何计算的?
  2. 物联网管理软件的设计
  3. 【工作秘籍】Facebook内部高效工作大揭秘
  4. python3遍历技巧
  5. Industry AI Live | 行为动作定位的算法流程介绍与分享
  6. JAVA 中字符串的截取,要求不能截取半个汉字
  7. 华为交换机linux版本号,Cisco和华为交换机常用配置命令总结
  8. spring boot Redis集成—RedisTemplate
  9. linux按日期备份mysql,在Linux、Windows上如何按日期逻辑备份数据库
  10. CTFHUB 《请求方式》 http请求,curl命令总结
  11. 5脚耳机插座原理图_手机原理图的解读
  12. 使用python实现win10系统和arduino usb串口通信
  13. vue 组件通信合集
  14. 观察containerd-shim-runc-v2进程与容器里的1号进程
  15. 您的工厂生产精益了吗?-蔡颖先生首发于畅享网
  16. 不要混淆事件的互不相容和互相独立
  17. 魔兽世界怀旧服最新服务器开发时间,怀旧服全部服务器开放时间
  18. [CF14E]Camels
  19. kali攻击wifi、破解wifi密码详细教程(二)
  20. Ubuntu彻底卸载软件和清理磁盘空间

热门文章

  1. Python第三课:列表,元组,集合
  2. Hashcode底层实现原理
  3. 仿照vue实现双向数据绑定兼容IE6
  4. PCL笔记八:关键点
  5. android证书在线生成方法
  6. ae计算机没有该字体,【干货】自己动手,完美解决AE CC 2017/CC 2018/CC 2019字体问题CT generic: not ascii...
  7. 微信小程序接入知晓云插件sdk入门
  8. 前端导出word图片
  9. 终极事务处理(XTP,Hekaton)——万能大招?
  10. AP: Oracle EBS AP INVOICE TAX 税码计算规则(ZT)