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> 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); } }
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者。
今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题。因为串口传送的浮点数据格式与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);
}
}