C# 四个字节十六进制数和单精度浮点数之间的相互转化
2015-10-11 21:51
525 查看
即是所谓的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);
1》这种转换方法经常用于串口通讯中,表示范围足够各种传感器数值传输及工控场合,将要发送的浮点数据转换为4个字节的十六机制数,然后由串口发出,在接收端再将其转换为浮点数。
2》单片机或非.net环境下使用转换程序则不能调用BitConverter类!
二、提供以下代码以供转换:
1》未修改过的如下:可以在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; } }
2》如果对工程进行直接编译会报出一下错误:这是因为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,测试方法可以随着需求改变。
相关文章推荐
- c#调用COM组件
- Tomcat端口被占用解决方法(不用重启)
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- “传奇”图象数据存储方式
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法