因工作需要,把再串口通信中浮點數與字節流的數據轉換函數放在這,轉發的,謝謝原作者。
今天花了一天的時間搜羅資料,為了解決一個串口編程的進制轉化問題。因為串口傳送的浮點數據格式與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);
}
}