2013-03-10 74 views
0

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

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

我发现这个代码,它似乎是好的:uint num = uint.Parse(hex,System.Globalization.NumberStyles.AllowHexSpecifier); byte [] floatVals = BitConverter.GetBytes(num); float f = BitConverter.ToSingle(floatVals,0); – 2013-03-10 06:06:20

+0

把这作为一个答案.. – 2013-03-10 06:08:54

回答

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);将在little endian平台上获得byte[]{ 0x00, 0x56, 0xE6, 0x42 }


如果你坚持写一个十六进制的文字,你不需要转换字节序(因为它永远是正确的,看到@乔治的评论)

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

谢谢,但我怎么能大/小端之间进行转换?有没有现成的功能? – 2013-03-10 06:10:54

+0

@Ali_dotNet你可能想要阅读我编辑的答案。排序的东西很棘手。 – 2013-03-10 06:27:40

+2

GetBytes在平台的字节序中返回一个字节数组。 ToSingle在平台的字节序中获取一个字节数组。所以字节顺序不应该颠倒。 (GetBytes的返回值是{0x00,0x56,0xE6,0x42}) – George 2013-03-10 06:28:49

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 Analyzer

+0

我没有看到你的for循环和反转整个数组(它只有4个字节组成一个'float'无论如何)。 – 2013-03-10 06:50:12

相关问题