找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2689|回复: 0
收起左侧

用四个字节十六进制数表示单精度浮点数

[复制链接]
ID:783526 发表于 2020-6-19 19:13 | 显示全部楼层 |阅读模式
即是所谓的IEEE754标准,这也是大多数硬件存储浮点数的标准。单精度浮点数占4个字节,表示范围为:在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。

在C#中的转换函数为:
1,由四个字节的十六机制数组转浮点数:
         byte[] bytes = new byte[4];
         BitConverter.ToSingle(bytes, 0);
例如
        byte[] byData = new byte[5]{0x01, 0xa4, 0x70, 0x9d, 0x3f};
        float fData;
        fData = BitConverter.ToSingle(byData, 1);//即将0xa4, 0x70, 0x9d, 0x3f变为float型数
        txt_SetValue_r1.Text = fData.ToString();//显示为1.23

2,由浮点数转数组:
byte[] bytes = BitConverter.GetBytes(floatValue);

这种转换方法经常用于串口通讯中,表示范围足够各种传感器数值传输及工控场合,将要发送的浮点数据转换为4个字节的十六机制数,然后由串口发出,在接收端再将其转换为浮点数。
单片机或非.net环境下使用转换程序则不能调用BitConverter类!
提供以下代码以供转换:
未修改过的如下:可以在C#中直接调用而不用库函数
      public static float ToFloat(byte[] data)
       {
           float a = 0;
           byte i;
           byte[] x = data;
           unsafe
           {
               void* pf;
               fixed (byte* px = x)
               {
                   pf = &a;
                   for (i = 0; i < data.Length; i++)
                   {
                       *((byte*)pf + i) = *(px + i);
                   }
               }
           }
               
           
           return a;
       }   
       public static byte[] ToByte(float data)
       {
           unsafe
           {
               byte* pdata = (byte*)&data;
               byte[] byteArray = new byte[sizeof(float)];
               for (int i = 0; i < sizeof(float); ++i)
                   byteArray[ i] = *pdata++;
           
               return byteArray;
           }
       }   

如果对工程进行直接编译会报出一下错误:这是因为C#默认不提供指针支持,只有在不安全代码的形式下才可以用指针。

错误 1 不安全代码只会在使用 /unsafe 编译的情况下出现 E:\Visual Studio 2008\Projects\TEST\testOfFloatConsolt\testOfFloatConsolt\Program.cs 26 13 testOfFloatConsolt这时选择VS的菜单栏中的项目->"Project"属性->生成->常规->允许不安全代码 勾选即可  
单片机串口通讯浮点转换函数
我在AVR串口通信协议中用到了这部分,直接将单片机的运算结果(浮点类型)转换为(字节类型)嵌入串口通信协议中,上传至上位机。
下面为符合IEEE754标准将浮点数转换为四个字节的数组的函数源代码:已经用于mega16单片机的串口通信中。
WinAVR-20090313测试通过:
voidFloatToByte(floatfloatNum,unsigned char* byteArry)
{
    char* pchar=(char*)&floatNum;
    for(inti=0;i<sizeof(float);i++)
    {
    *byteArry=*pchar;
    pchar++;
    byteArry++;
    }
}
下面为符合IEEE754标准的由四个字节型数组转化为相应的浮点数
WinAVR-20090313测试通过:
    floatByteToFloat(unsigned char* byteArry)
{
  return*((float*)byteArry);
}

调用测试方法:其中USART_Transmit();为向串口发送的函数。
    unsigned charfloatToByte[4];
    FloatToByte(12.15,floatToByte);
    floata=ByteToFloat(floatToByte);
    FloatToByte(a,floatToByte);
    USART_Transmit(floatToByte[0]);   
    USART_Transmit(floatToByte[1]);                           
    USART_Transmit(floatToByte[2]);
    USART_Transmit(floatToByte[3]);

在上位机用串口进行读取时调用
BitConverter.ToSingle(bytes, 0);
就会转换成12.15,测试方法可以随着需求改变。



最简单的而方法,编程最简单,也不需要了解浮点数协议
单片机和PC软件均把浮点数定义成联合体就行了,这样根本不需要了解浮点数规则
union FU
{
   float fData;
   unsigned char cData[4];
} UFDATA;

发送和接收直接操作字节就行,用memcpy拷贝就可以。
例如:
UFDATA.cData[0] = 0xa4;
UFDATA.cData[1] = 0x70;
UFDATA.cData[2] = 0x9d;
UFDATA.cData[3] = 0x3f;
printf("float: %f\n",UFDATA.fData);//得到浮点数1.23

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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