在C#中将4字节数组转换为浮点数的问题

8

我正在使用C#从某个控制器读取字节数组,并将它们转换为它们的类型。所有的值(int、string)都没问题,除了float类型的值。 应该得到的值是533174.1。 但是在读取数组时,

byteArr[0]=2
byteArr[1]=73
byteArr[2]=98
byteArr[3]=43

获取了一些无用的数值。我试过使用System.BitConverter.ToDouble(bytesArr,0)以及其他方法,但都没有成功。请帮忙解决。谢谢,Igal。

3个回答

17

你的字节序是倒置的。这个函数应该可以正确地将你的字节数组转换为浮点数:

static float ToFloat(byte[] input)
{
    byte[] newArray = new[] { input[2], input[3], input[0], input[1] };
    return BitConverter.ToSingle(newArray, 0);
}

ToFloat(new byte[]{2,73,98,43}) == 533174.1

4
  1. 字节序如何?尝试反转单词顺序了吗?在Windows中,533174.1是98、43、2、73。
  2. 4个字节是单精度浮点数(ToSingle),不是双精度浮点数。

浮点数不是双精度浮点数。 - John Lord

1
要将四个位置的字节数组转换为浮点数,应使用BitConverter.ToSingle函数,该函数读取所使用的数组中的四个位置,例如:
var input = new byte[]{103, 242, 50, 67};
var floatValue = BitConverter.ToSingle(input, 0);

floatValue = 178.946884

BitConverter.ToSingle方法接收两个参数:字节数组和开始取值的位置。

我们也可以使用长度更长的数组,并定义从哪里开始转换。

var secondInput = new byte[]{103, 242, 50, 67, 227, 55, 179, 67};
var firtsFloatValue = BitConverter.ToSingle(input, 0);
var secondFloatValue = BitConverter.ToSingle(input, 4);

第一个浮点数值为178.946884

第二个浮点数值为358.4366

最终从[98, 43, 2, 73]开始获得值533174.1,我们必须使用

var input = new byte[]{98, 43, 2, 73};
var floatValue = BitConverter.ToSingle(input, 0);

floatValue = 533174.1


1
伙计,你在示例中的代码是正确的,但你说了两次“Convert”,而不是BitConverter。 这导致了问题。 - John Lord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接