C# 如何将有符号字节数组转换为浮点?

C# 如何将有符号字节数组转换为浮点?,c#,arrays,C#,Arrays,我只是对如何将4个有符号字节的数组转换为浮点数感到困惑 我只知道对于一个无符号字节数组bts,可能我可以使用这个函数 BitConverter.ToSingle(bts, 0); 但是,看起来BitConverter.ToSingle只接受字节数组而不是sbyte数组 谁能给我一些建议吗 谢谢 也许是这样: float num = 0; for (int i = 0; i < sbytesArr.Length; i++) { num = (num | sbytesArr[i]

我只是对如何将4个有符号字节的数组转换为浮点数感到困惑

我只知道对于一个无符号字节数组bts,可能我可以使用这个函数

BitConverter.ToSingle(bts, 0);
但是,看起来BitConverter.ToSingle只接受字节数组而不是sbyte数组

谁能给我一些建议吗

谢谢

也许是这样:

float num = 0;

for (int i = 0; i < sbytesArr.Length; i++)
{
     num = (num | sbytesArr[i]) << i * 4;
}
也许是这样:

float num = 0;

for (int i = 0; i < sbytesArr.Length; i++)
{
     num = (num | sbytesArr[i]) << i * 4;
}

假设您的有符号字节位于名为sbts的数组中,您可以首先转换为无符号字节数组,然后使用BitConverter.ToSingle


假设您的有符号字节位于名为sbts的数组中,您可以首先转换为无符号字节数组,然后使用BitConverter.ToSingle

:

这段代码实际上在运行时工作。因此可以传入您拥有的数组

BitConverter.ToSingle((byte[])(object)bts, 0);
:

这段代码实际上在运行时工作。因此可以传入您拥有的数组

BitConverter.ToSingle((byte[])(object)bts, 0);
调用GetFloatValue方法,将四个sbyte的una数组作为参数传递

    public float GetFloatValue(sbyte[] data)
    {
        return bytesToFloat(data[0], data[1], data[2], data[3]);
    }

    private static float bytesToFloat(sbyte b0, sbyte b1, sbyte b2, sbyte b3)
    {
        int mantissa = (byte)b0 + ((byte)b1 << 8) + ((byte)b2 << 16);
        return (float)(mantissa * Math.Pow(10, b3));
    }
调用GetFloatValue方法,将四个sbyte的una数组作为参数传递

    public float GetFloatValue(sbyte[] data)
    {
        return bytesToFloat(data[0], data[1], data[2], data[3]);
    }

    private static float bytesToFloat(sbyte b0, sbyte b1, sbyte b2, sbyte b3)
    {
        int mantissa = (byte)b0 + ((byte)b1 << 8) + ((byte)b2 << 16);
        return (float)(mantissa * Math.Pow(10, b3));
    }

因为它转换对象类型,所以不转换值。每4个字节将成为一个浮点值。因为字节只是内存中浮点表示的一部分,所以符号在内存中没有任何意义。如果您必须转换值,那么您必须创建一个新的浮点数组,并在其中逐个复制值。您的签名字节以何种方式表示浮点?通常4个无符号字节表示一个浮点,如下所述。。如果你给出一个具体的例子,我们可以给出一个解决方案,也就是说,如果我得到一个有符号数组和另一个无符号数组,但是它们有相同的字节,理论上它们可以变成相同的浮点数…但是。。。你是如何得到sbyte[]的?我猜理论上你可以使用BitConverter.ToSinglebts.Selectb=>byteb+128.toarray如果这是一个浮点的位表示,那么它们本来就不应该是sbyte。检查上游的数据流是否存在问题。因为它转换对象类型,所以不转换值。每4个字节将成为一个浮点值。因为字节只是内存中浮点表示的一部分,所以符号在内存中没有任何意义。如果您必须转换值,那么您必须创建一个新的浮点数组,并在其中逐个复制值。您的签名字节以何种方式表示浮点?通常4个无符号字节表示一个浮点,如下所述。。如果你给出一个具体的例子,我们可以给出一个解决方案,也就是说,如果我得到一个有符号数组和另一个无符号数组,但是它们有相同的字节,理论上它们可以变成相同的浮点数…但是。。。你是如何得到sbyte[]的?我猜理论上你可以使用BitConverter.ToSinglebts.Selectb=>byteb+128.toarray如果这是一个浮点的位表示,那么它们本来就不应该是sbyte。检查上游数据流中的问题。可能我没有把问题说清楚,我想要的结果是将数组中的4个字节转换为浮点数,而不是浮点数数组。。但是谢谢你的回答,不是吗?也许我没有把我的问题说清楚,我想要的结果是将数组中的4个字节转换成浮点数,而不是浮点数数组。。但是谢谢你的回答,是不是应该用这个表达式,而不是and?OP要求的是另一种方法OP要求的是另一种方法这里有一些关于这种技术的讨论:我认为这里的关键评论是:这会改变数组的编译时类型。有用的技术,但这取决于最终消耗结果的是什么。例如,System.Array.CopyArray,int,Array,int,int查看两个数组的运行时类型,如果尝试将实字节[]复制到伪装为字节[]的sbyte[],则会引发异常.这里还有一些关于这种技术的讨论:我认为这里的关键评论是:它所做的是改变数组的编译时类型。有用的技术,但这取决于最终消耗结果的是什么。例如,System.Array.CopyArray,int,Array,int,int查看两个数组的运行时类型,如果尝试将实字节[]复制到伪装为字节[]的sbyte[],则会引发异常。