2013-03-10 76 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

相關問題