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/1988baoleilei/blog/item/918a85664e4c177a0d33fa68.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值