【问题标题】:How to convert an array of signed bytes to float?如何将有符号字节数组转换为浮点数?
【发布时间】:2014-05-03 11:41:27
【问题描述】:

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

我只知道一个无符号字节bts的数组,也许我可以使用这个函数

BitConverter.ToSingle(bts, 0);

但是,看起来 BitConverter.ToSingle 只接受字节数组而不是 sbyte 数组。

有人能给我一些建议吗?

谢谢!

【问题讨论】:

  • 因为它转换对象类型,它不转换值。每 4 个字节将变成一个浮点值。因为字节只是内存中浮点表示的一部分,所以符号在那里没有任何意义。如果必须转换值,则必须创建一个新的浮点数组并在那里复制值(一个接一个)。
  • 您的带符号字节以什么方式表示浮点数?通常 4 个无符号字节代表一个浮点数,如下所述。如果你给出一个具体的例子,我们可以给出一个解决方案
  • 也就是说,如果我得到一个有符号数组和另一个无符号数组但字节相同,理论上它们可以变成相同的浮点数.....
  • 但是……你是怎么得到 sbyte[] 的?我想理论上你可以BitConverter.ToSingle(bts.Select(b=>(byte)(b+128)).ToArray())
  • 如果这是关于浮动的一点表示,那么他们一开始就不应该是sbyte。检查上游的数据流是否存在问题。

标签: c# arrays


【解决方案1】:

也许是这样的:

float num = 0;

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

【讨论】:

  • 也许我没有把我的问题说清楚,我想要的结果是将一个数组中的 4 sbytes 转换为一个浮点数,而不是一个浮点数组。但是谢谢你的回答跨度>
  • 你应该or那个表达而不是and吗?
【解决方案2】:
    Float value = 5000.1234;
//
// Invoke BitConverter.GetBytes to convert double to bytes.
//
byte[] array = BitConverter.GetBytes(value);
foreach (byte element in array)
{
    Console.WriteLine(element);
}
//
// You can convert the bytes back to a double.
//
Float result = BitConverter.Tofloat(array, 0);
Console.WriteLine(result);

【讨论】:

  • OP 正在寻求其他方式
【解决方案3】:

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

byte[] bts = new byte[sbts.Length];
Buffer.BlockCopy(sbts, 0, bts, 0, sbts.Length);
float f = BitConverter.ToSingle(bts, 0);

【讨论】:

    【解决方案4】:

    It is a little known fact that byte and sbyte are interchangeable at the CLR level:

    sbyte[] a = new sbyte[1];
    byte[] b = (byte[])(object)a;
    

    此代码实际上在运行时工作。所以可以传入你拥有的数组。

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

    【讨论】:

    • 这里有更多关于这种技术的讨论:stackoverflow.com/questions/829983/… 我认为这里的关键评论是:这样做是改变数组的编译时类型。有用的技术,但这取决于最终消耗结果的内容。例如,System.Array.Copy(Array, int, Array, int, int) 查看两个数组的运行时类型,如果您尝试将“真实”字节 [] 复制到伪装成 byte[]sbyte[],则会引发异常。
    【解决方案5】:

    调用GetFloatValue 方法传递一个四字节的数组作为参数

        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));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多