将十六进制转换为浮点32

本文关键字:十六进制 转换 | 更新日期: 2023-09-27 18:03:14

我有一个十六进制的(42 E6 56 00),应该转换成这个浮点数:115.2,当然它是浮点32(我用计算器得到了115.2)。现在我想用c#执行这个操作,我使用下面的代码,但它给了我奇怪的值:

byte[] bytes = BitConverter.GetBytes(0x42E65600);
if (BitConverter.IsLittleEndian) {
    bytes = bytes.Reverse().ToArray();
}
float myFloat = BitConverter.ToSingle(bytes, 0);

将十六进制转换为浮点32

更好的写法:

byte[] bytes = new byte[]{ 0x42, 0xE6, 0x56, 0x00 }; // Big endian data
if (BitConverter.IsLittleEndian) {
    Array.Reverse(bytes); // Convert big endian to little endian
}
float myFloat = BitConverter.ToSingle(bytes, 0);

注意BitConverter使用平台的端序。

我测试了一个IEEE-754分析,似乎你的源数据是真的大端,所以这是正确的方式来写。

你可能不知道,BitConverter.GetBytes(0x42E65600);会在小端平台上得到byte[]{ 0x00, 0x56, 0xE6, 0x42 }


如果你坚持写十六进制文字,你不需要转换结尾(因为它总是正确的,见@George的评论)

byte[] bytes = BitConverter.GetBytes(0x42E65600);
float myFloat = BitConverter.ToSingle(bytes, 0); // Always be correct

我有一个十六进制(42 E6 5600),应该翻译成这个浮点数:115.2

如果是这种情况,那么你的数据是大端字节格式

BitConverter.IsLittleEndian  

这将决定你的位转换比特数,所以你会希望条件为

if (!BitConverter.IsLittleEndian)

最后,你的端序转换是错误的。您不希望反转整个数组,而是交换单个float项

        for (int i = 0; i < data.Length / 2; i++)
        {
            Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
        }

结合所有这些校正,你的代码应该看起来像

   static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp;
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
    static byte[] Big2Little(byte[] data)
    {
        for (int i = 0; i < data.Length / 2; i++)
        {
            Swap<byte>(ref data[i], ref data[data.Length - i - 1]);
        }
        return data;
    }
    static void Main(string[] args)
    {
        byte[] bytes = BitConverter.GetBytes(0x42E65600);
        if (!BitConverter.IsLittleEndian)
        {
            bytes = Big2Little(bytes);
        }
        float myFloat = BitConverter.ToSingle(bytes, 0);
        System.Console.Out.WriteLine(myFloat);
    }

注释您可以从IEEE Analyzer

验证您的结果