最近在处理下位机给上位机发送数据,采用的485通讯协议,解析下位机发送的数据,然后遇到问题即:下位机是采用C语言,一次性只能发送8位的16进制,浮点数是32位,只能分四次发送,然后接收到4个16进制数据,我是先将这四个数据用移位的方法得到一个String数据,然后再传进下面这个方法,得到浮点数。
代码根据 https://blog.csdn.net/weixin_42985452/article/details/121503593编写
将以下32位二进制输入,可以得到正确答案
/// <summary>
/// IEEE754转换为浮点数
/// </summary>
根据 https://blog.csdn.net/weixin_42985452/article/details/121503593编写
/// <param name="willBuild">需要转换的二进制数组</param>
/// <returns></returns>
public static float[] StringToFloat(string[] willBuild)
{
float[] floatValue = new float[willBuild.Length];
int j = 0;
foreach (var item in willBuild)
{
float Value, sum = 0;
int sign = Convert.ToInt16(item.Substring(0, 1).ToString());
//截取31位到24位
string E_exponent = item.Substring(1, 8).ToString();
//将二进制 E_exp字符串 转换为十进制
int E = Convert.ToInt32(E_exponent, 2);
//截取23位到1位
string E_fraction = item.Substring(9, 23).ToString();
//例子:01000000000000000000000
for (int i = 1; i <= 23; i++)
{
if (Convert.ToInt16(E_fraction.Substring(i - 1, 1).ToString()) == 1)
//如果截取的E_fraction内等于1则进行运算
{
sum += (float)Math.Pow(2, -i);
}
}
Value = (float)Math.Pow((-1), sign) * (float)Math.Pow((2), (E - 127)) * (1 + sum);
floatValue[j++] = Value;
}
return floatValue;
}
如有错误或者不妥,请指正!