0

我有一个十六进制(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);
4

2 回答 2

2

更好的写法:

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 Analysis测试过,看来你的源数据真的是大端,所以这是正确的写法。

你可能不知道,但BitConverter.GetBytes(0x42E65600);byte[]{ 0x00, 0x56, 0xE6, 0x42 }在 little endian 平台上。


如果您坚持编写十六进制文字,则无需转换字节顺序(因为它始终是正确的,请参阅@George 的评论)

byte[] bytes = BitConverter.GetBytes(0x42E65600);
float myFloat = BitConverter.ToSingle(bytes, 0); // Always be correct
于 2013-03-10T06:09:40.760 回答
1

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

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

BitConverter.IsLittleEndian  

这将确定您的位转换位数是多少,因此您希望条件为

if (!BitConverter.IsLittleEndian)

最后,您的字节序转换是错误的。您不想反转整个数组,而是交换各个浮点条目

        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 分析仪验证您的结果

于 2013-03-10T06:35:33.937 回答