C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者。
今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题。因为串口传送的浮点数据格式与IEEE-754标准(32)有关。此标准长度为32位,四个字节的浮点数据传送顺序为先低字节后高字节,作为8个ASCII码传送。格式:D31符号位(1位表正负),D30~D23价码(8位),D22~D0尾数(23位)。
希望能够研究此块的同行们提供些帮助,下面是C#的转化方法:
/// <summary>
/// 将二进制值转ASCII格式十六进制字符串
/// </summary>
/// <paramname="data">二进制值</param>
/// <paramname="length">定长度的二进制</param>
/// <returns>ASCII格式十六进制字符串</returns>
public static string toHexString(intdata, int length)
{
stringresult = "";
if (data> )
result = Convert.ToString(data, ).ToUpper();
if(result.Length < length)
{
// 位数不够补0
StringBuilder msg = new StringBuilder();
msg.Length = ;
msg.Append(result);
for (; msg.Length < length; msg.Insert(, ""));
result = msg.ToString();
}
returnresult;
} ///<summary>
/// 将浮点数转ASCII格式十六进制字符串(符合IEEE-754标准(32))
/// </summary>
/// <paramname="data">浮点数值</param>
/// <returns>十六进制字符串</returns>
public static stringfloatToIntString(float data)
{
byte[]intBuffer = BitConverter.GetBytes(data);
StringBuilder stringBuffer = new StringBuilder();
for (int i =; i < intBuffer.Length; i++)
{
stringBuffer.Insert(, toHexString(intBuffer[i] & 0xff, ));
}
returnstringBuffer.ToString();
} ///<summary>
/// 将ASCII格式十六进制字符串转浮点数(符合IEEE-754标准(32))
/// </summary>
/// <paramname="data">十六进制字符串</param>
/// <returns>浮点数值</returns>
public static floatintStringToFloat(String data)
{
if(data.Length < || data.Length > )
{
//throw new NotEnoughDataInBufferException(data.length(), 8);
throw (new ApplicationException("缓存中的数据不完整。"));
}
else
{
byte[] intBuffer = new byte[];
// 将16进制串按字节逆序化(一个字节2个ASCII码)
for(int i=; i<; i++)
{
intBuffer[i] = Convert.ToByte(data.Substring(( - i) * , ),);
}
return BitConverter.ToSingle(intBuffer, );
}
}
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者。
今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题。因为串口传送的浮点数据格式与IEEE-754标准(32)有关。此标准长度为32位,四个字节的浮点数据传送顺序为先低字节后高字节,作为8个ASCII码传送。格式:D31符号位(1位表正负),D30~D23价码(8位),D22~D0尾数(23位)。
希望能够研究此块的同行们提供些帮助,下面是C#的转化方法:
/// <summary>
/// 将二进制值转ASCII格式十六进制字符串
/// </summary>
/// <paramname="data">二进制值</param>
/// <paramname="length">定长度的二进制</param>
/// <returns>ASCII格式十六进制字符串</returns>
public static string toHexString(intdata, int length)
{
stringresult = "";
if (data> 0)
result = Convert.ToString(data, 16).ToUpper();
if(result.Length < length)
{
// 位数不够补0
StringBuilder msg = new StringBuilder(0);
msg.Length = 0;
msg.Append(result);
for (; msg.Length < length; msg.Insert(0, "0"));
result = msg.ToString();
}
returnresult;
}
///<summary>
/// 将浮点数转ASCII格式十六进制字符串(符合IEEE-754标准(32))
/// </summary>
/// <paramname="data">浮点数值</param>
/// <returns>十六进制字符串</returns>
public static stringfloatToIntString(float data)
{
byte[]intBuffer = BitConverter.GetBytes(data);
StringBuilder stringBuffer = new StringBuilder(0);
for (int i =0; i < intBuffer.Length; i++)
{
stringBuffer.Insert(0, toHexString(intBuffer[i] & 0xff, 2));
}
returnstringBuffer.ToString();
}
///<summary>
/// 将ASCII格式十六进制字符串转浮点数(符合IEEE-754标准(32))
/// </summary>
/// <paramname="data">十六进制字符串</param>
/// <returns>浮点数值</returns>
public static floatintStringToFloat(String data)
{
if(data.Length < 8 || data.Length > 8)
{
//throw new NotEnoughDataInBufferException(data.length(), 8);
throw (new ApplicationException("缓存中的数据不完整。"));
}
else
{
byte[] intBuffer = new byte[4];
// 将16进制串按字节逆序化(一个字节2个ASCII码)
for(int i=0; i<4; i++)
{
intBuffer[i] = Convert.ToByte(data.Substring((3 - i) * 2, 2),16);
}
return BitConverter.ToSingle(intBuffer, 0);
}
}
C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)的更多相关文章
- 打印一个浮点数组,会输出字符串"Hello, world“ & 浮点数的二进制表示(IEEE 754标准)
#include <stdio.h> #include<stdlib.h> int main() { float a[3] = { 1143139122437582505939 ...
- 【算法】解析IEEE 754 标准
目录结构: contents structure [-] 浮点数的存储过程 次正规数(Denormalized Number) 零(zero) 非数值(NaN) 无穷大(infinity) 除数为0. ...
- IEEE 754标准--维基百科
IEEE二进制浮点数算术标准(IEEE 754) 是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denorm ...
- python 警惕 IEEE 754标准
双精度浮点数格式,即IEEE 754标准 >>> 0.1+0.2 0.30000000000000004 >>> (0.1+0.2)==0.3 False > ...
- 基于 IEEE 754 标准的 单精度浮点数计算方式 (未完成)
def dec2bin(dec): if dec < 0: s = ' dec = dec * (-1) else: s = ' e = 127 dec = float(dec) r = int ...
- 【转】浮点数与IEEE 754
http://www.cnblogs.com/kingwolfofsky/archive/2011/07/21/2112299.html 浮点数 1. 什么是浮点数 在计算机系统的发展过程中,曾经 ...
- IEEE 754标准
IEEE 754-1985 was an industry standard for representing floating-point numbers in computers, officia ...
- IEEE二进制浮点数算术标准(IEEE 754)
整理自IEEE 754 IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0) ...
- IEEE 754二进制浮点数算术标准
可能很多人都遇到过浮点数精度丢失的问题,下面以JavaScript为例. 1 - 0.9 = 0.09999999999999998 纳尼,不应该是0.1么,怎么变成0.099999999999999 ...
随机推荐
- JDK1.8导致发送邮件失败
问题:本地JDK1.6测试可以发送邮件,但是linux上jdk1.8发送邮件失败.报错: Sending the email to the following server failed : smtp ...
- Spring操作指南-针对JDBC配置声明式事务管理(基于注解)
- jenkins配置邮件
1.安装 Email Extension Plugin 插件 2.进入系统管理--系统设置 3.按照如下图设置 首先找到 Extended E-mail Notification
- ios 配置https
一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的 . 我们还需要防止中间人攻击(不明白的自 ...
- WebForm 页面传值
一.使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...
- CSS中LI圆点样式li {list-style-type:符号名称}
css中用list-style-type指定列表(lists)前面符号,如下: li {list-style-type:符号名称} 符号名称可用的值为: disc : CSS1 实心圆 circle ...
- TP框架常用(一)
25.显示最后一条查询的sql语句:主要用于在连贯操作时,检测拼接的sql语句是否正确 echo $this->db->last_query();//如:select * from pt_ ...
- Android 屏幕适配
前言 手机的屏幕适配一直是非常麻烦的,现在我就以做笔记的方式来简单梳理下 单位理解 首先让我们先来看看关于手机所用到的单位 真实物理尺寸单位: mm:表示毫米,是屏幕的物理尺寸. in:表示英寸,是屏 ...
- Visual Studio配色方案
Eclipse开源工具和VS在诸多方面真的是差距非常大,无奈Java编程,使用VS非常麻烦.所以只能选择Eclipse 但是Eclipse的系统配色,又实在是不舒服,于是抽时间,从VS上抠了一份默认的 ...
- Excel 导入 导出 Microsoft
导出: private void exportExcel() { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { Application. ...