Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2778|回复: 0

15-IEEE754规约,浮点数和16进制之间的转换

[复制链接]

56

主题

56

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2020-9-21 10:11:19 | 显示全部楼层 |阅读模式



前言
  现在很多通信都需要传输各种数据,所有的仪器仪表都是把数据转化为16进制以后传输
  为了使转换通用,所以才有了 IEEE754规约

直接上菜
  
typedef union Resolve
{
  float float_data;
  long long_data;
  char char_table[4];
}Resolve_Typedef;

819239-20191228135439669-1525131047.png




819239-20191228135459936-760192371.png






254 转为16进制
   819239-20191228140034735-2146375987.png


   819239-20191228140053657-551427268.png


  注意:我使用的是STM32,它储存数据的时候低位在前高位在后

  咱比较喜欢这样看数据 00 00 00 FE  这就是254


65536 转为16进制
   819239-20191228140226516-2043990477.png


   819239-20191228140300154-22161546.png


  00 01 00 00  这就是65536的16进制表示


说明
  大家有没有疑问为什么写的是转化为4字节
   819239-20191228140824713-547978368.png


  大家如果做仪器仪表通信做久了就会发现几乎都是转换为4字节

  只不过在传输的时候有的仪器仪表是先传输高位

  就像咱上面的 65536  16进制是   00 01 00 00

  有极少数的仪器仪表先传输低位  00 00 01 00




220.5 转为16进制
   819239-20191228141225635-851843161.png


   819239-20191228141302430-403450546.png


  











有16进制浮点数数据了,转为浮点数
  假设数据是 00 80 5C 43
   819239-20191228141643119-1761212883.png


   819239-20191228141715622-1638786473.png



扩展 C# 实现65536 转为16进制
   byte[] byt = BitConverter.GetBytes(65536);//转为byt,默认就是转成4字节
  转换之后  
  byt[0] = 0x00;
  byt[1] = 0x00;
  byt[2] = 0x01;
  byt[3] = 0x00;

  byt[0] 存储的是最低位,和上面的单片机一样
  如果通信规定先传输高位,00 01 00 00 那么传输的时候
  byt[3],byt[2],byt[1],byt[0]      



220.5 转为16进制
//和咱单片机定义联合体解析一样的道理
//转为byt,默认就是转成4字节
byte[] byt = BitConverter.GetBytes(220.5f);
转换之后:
byt[0] = 0x00;
byt[1] = 0x80;
byt[2] = 0x5c;
byt[3] = 0x43;


注意:220.5f  后面需要加f
否则会按照double数据类型进行转换
按照 double 进行转换的,转换出来是8字节
byt[0] = 0x00;
byt[1] = 0x00;
byt[2] = 0x00;
byt[3] = 0x00;
byt[4] = 0x00;
byt[5] = 0x90;
byt[6] = 0x6B;
byt[7] = 0x40;
有16进制整形数据了,转为整形数据
  假设数据是65536    : 00 01 00 00
  
  byte[] byteValue = new byte[4];
  byteValue[3] = 0x00;
  byteValue[2] = 0x01;
  byteValue[1] = 0x00;
  byteValue[0] = 0x00;

  int intValue = BitConverter.ToInt32(byteValue,0);

  intValue 就是 65536
  注意
   819239-20191229214929743-2043910445.png


  倒过来填写的

  因为C#默认是低位放到低位,高位放到高位(小端模式)


有16进制浮点数数据了,转为浮点数
  假设数据是 220.5     :43 5C 80 00
  
  byte[] byteValue = new byte[4];
  byteValue[0] = 0x43;
  byteValue[1] = 0x5c;
  byteValue[2] = 0x80;
  byteValue[3] = 0x00;

  float floatValue = BitConverter.ToSingle(byteValue, 0);
  floatValue计算出来就是 220.5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2020-10-30 08:59 , Processed in 0.083217 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表