【问题标题】:Byte Array to Float Conversion C#字节数组到浮点数转换 C#
【发布时间】:2014-02-22 14:47:10
【问题描述】:

我已尝试使用以下 C# 代码将 十六进制文字转换为浮点 并获得正确的结果。我希望改为输入一个字节数组并将其转换为浮点数,但似乎无法得到正确的结果。

0x4229ec00 是当前格式。我需要它的byte array 格式...

new byte[]{ 0x01, 0x04, 0x01, 0x60, 0x00, 0x02, 0x70, 0x29}; //current output 42.48

代码如下:

byte[] bytes = BitConverter.GetBytes(0x4229ec00);
float myFloat = floatConversion(bytes);

public float floatConversion(byte[] bytes)
{
    float myFloat = BitConverter.ToSingle(bytes, 0);
    return myFloat;
}

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • @JamesBarrass:他正在转换 4 个字节,而不是 8 个字节:#42、#29、#ec 和 #00。
  • @RoyDictus:“类似...0x01, 0x04, 0x01, 0x60, 0x00, 0x02, 0x70, 0x29
  • @Maria88:float 的大小确实是 4 个字节,而不是 8 个,所以如果你将那个 8 字节数组转换为浮点数,它就不是 float but double.
  • 请把问题描述清楚。您想将 4N 个字节的数组转换为 N 个浮点数。是这样吗?你卡在哪一部分了?
  • 我们正在努力解决的问题是您想用 8 个字节做什么。将它们转换为两个浮点数或一个双精度数。并且对字节顺序进行一些澄清会有所帮助。为什么你的字节是这个顺序的?他们是通过电线到达的吗?

标签: c# floating-point hex bytearray


【解决方案1】:

float (Single) 是一个 4 字节 值;

你的测试值0x4229ec00包含4个字节,分别是:0x42, 0x29, 0xEC, 0x00

x86 CPU 使用倒序字节(Little Endian),所以正确的字节数组是

0x00, 0xEC, 0x29, 0x42

代码

// Original array
Byte[] data = new Byte[] {0x42, 0x29, 0xEC, 0x00};
// 42.48047
// If CPU uses Little Endian, we should reverse the data 
float result = BitConverter.ToSingle(BitConverter.IsLittleEndian? data.Reverse().ToArray() : data, 0);

【讨论】:

  • @Maria88 我们都在寻求帮助。我们只需要更多信息。你问的问题不清楚。
  • 非常抱歉,如果我冒犯了你,只是在寻求帮助,下次会更清楚,非常抱歉,任何人都可以帮助反转字节数组中的字节,有没有简单的一行转换?
  • @Maria88:是的,你可以一行完成,看我的编辑
  • 这是一个伟大的贡献非常感谢你,我继续对这个网站怀有最大的尊重,并且会尽我所能做出贡献,因为像你这样的人,软件工程才如此很远,谢谢
【解决方案2】:

你可以修改你的浮点转换函数如下

    public float floatConversion(byte[] bytes)
    {
        if (BitConverter.IsLittleEndian)
        {
            Array.Reverse(bytes); // Convert big endian to little endian
        }
        float myFloat = BitConverter.ToSingle(bytes, 0);
        return myFloat;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多