• C# 四个字节十六进制数和单精度浮点数之间的相互转化


    即是所谓的IEEE754标准,这也是大多数硬件存储浮点数的标准。单精度浮点数占4个字节,表示范围为:在负数的时候是从
    -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。



    在C#中的转换函数为:


    1,由四个字节的十六机制数组转浮点数:


              byte[] bytes = new byte[4];


              BitConverter.ToSingle(bytes, 0);


    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测试通过:


    void FloatToByte(float floatNum,unsigned char* byteArry)
    {
        char*
    pchar=(char*)&floatNum;
        for(int
    i=0;i<sizeof(float);i++)
        {
         *byteArry=*pchar;
        
    pchar++;
         byteArry++;
        }
    }


    下面为符合IEEE754标准的由四个字节型数组转化为相应的浮点数


    WinAVR-20090313测试通过:


        float ByteToFloat(unsigned char* byteArry)
    {
      return
    *((float*)byteArry);
    }



    调用测试方法:其中USART_Transmit();为向串口发送的函数。


        unsigned char
    floatToByte[4];
        FloatToByte(12.15,floatToByte);
        float
    a=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,测试方法可以随着需求改变。

    转自:

    http://hi.baidu.com/wgnzebpqjsbntxd/item/5a7a3eda302f0e3f2a35c77d
  • 相关阅读:
    使用JS实现复制粘贴功能
    前端向后端发送请求(FormData),你们不要吐槽我,有的时候我也不想写注释
    最全面的数组去重详细解析
    查找字符串数组中的最长公共前缀
    最简单的让多行表格滚动方法
    送给vue初学者的 vue.js技巧
    git 和码云的上传文件代码操作
    常用模块 二
    深拷贝与浅拷贝
    常用模块升级
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/2739221.html
Copyright © 2020-2023  润新知