8字节的16进制如何转浮点数

8字节的16进制如何转浮点数?
下位机给的协议是:

img


4字节的16进制数用下面的程序能够转换

 string s = "42002F58";
            MatchCollection matches = Regex.Matches(s, @"[0-9a-zA-Z]{2}");
            byte[] bytes = new byte[matches.Count];
            for (int i = 0; i < bytes.Length; i++)
                bytes[i] = byte.Parse(matches[i].Value, System.Globalization.NumberStyles.AllowHexSpecifier);
            float m = BitConverter.ToSingle(bytes.Reverse().ToArray(), 0);
            Console.WriteLine(m);
            Console.ReadKey();

??????
协议说的很明白,ASC码,所以请别纠结啥BitConvet了

就是字符串拉

 byte[] data = new byte[] { 0x2b, 0x31, 0x2e, 0x32, 0x33, 0x34, 0x35, 0x20, 0x4f, 0x46 };

            var str= Encoding.ASCII.GetString(data);
float value = float.Parse(str.Substring(0, str.Length - 2));


结果是str:+1.2345 OF
协议含义:测量值 正1.2345 欧姆 不合格
value:1.2345

C#的话,如果大小端是对的,直接 BitConverter 转换
https://www.nhooo.com/note/qa0bik.html

byte[] bytes = new byte[8] { 0x41, 0x45, 0x85, 0x1F, 0x85, 0xEB, 0x51, 0xB8 }; // 8字节的16进制数据
float floatValue = BitConverter.ToSingle(bytes, 0); // 转换为浮点数
Console.WriteLine(floatValue); // 输出转换后的浮点数

先定义了一个包含8个字节的byte数组,其中存储了16进制数据。然后,使用BitConverter.ToSingle方法将该字节数组转换为浮点数,并将结果存储在floatValue变量中。最后,使用Console.WriteLine将转换后的浮点数输出到控制台。

可以使用BitConverter类将8字节的16进制转换为浮点数。

byte[] bytes = new byte[] { 0x40, 0x49, 0x0f, 0xdb, 0x22, 0xd7, 0x0a, 0x3d };
double result = BitConverter.ToDouble(bytes, 0);
Console.WriteLine(result);

参考 https://blog.csdn.net/zwb_578209160/article/details/119060375

十六进制转换成浮点数先要将十六进制数的整数部分和小数部分分别转换成十进制数,再加以合并,并保留浮点数精度。
十六进制数转换成十进制数整数的基本做法是使用"按权相加"法,把十六进制数首先写成加权系数展开式,然后按十进制加法规则求和。
十六进制小数转换成十进制小数采用"乘10取整,顺序排列"法。用10乘十六进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
例如十六进制数AF.3912转换成十进制数为AF.3912=(1016^1+1516^0).(216^-0+216^-1+216^-2+916^-3)=175.2229。浮点数的精度为小数点后2位,即十六进制数AF.3912=十进制数175.22。
扩展资料:
十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A-F分别表示十进制数字10-15.十六进制数的技术规则是“逢十六进一”,它的各位的权是以16的N次方标识的。
十六进制数的加减法的进/借位规则为:借一当十六,逢十六进一。 十六进制数同二进制数及十进制数一样,也可以写成展开式的形式。

代码如下:经测试可用

string s = "40710DFB";
MatchCollection matches = Regex.Matches(s, @"[0-9A-Fa-f]{2}");
byte[] bytes = new byte[matches.Count];
for (int i = 0; i < bytes.Length; i++)
  bytes[i] = byte.Parse(matches[i].Value, System.Globalization.NumberStyles.AllowHexSpecifier);
float m = BitConverter.ToSingle(bytes.Reverse().ToArray(), 0);
Console.WriteLine(m);