2013-02-05 53 views
0

我需要將很多存儲爲8字符十六進制字符串的值轉換爲C#程序中的浮點值。性能至關重要,因爲代碼將被調用至每秒50,000次。高性能8字節十六進制浮點值轉換?

至於功能,在Python代碼:

f = struct.unpack('<f', bytes.fromhex(strng))[0] 

做什麼,我需要的。我已經嘗試了「無聊」版本:

byte[] raw = BitConverter.GetBytes(int.Parse(hex, NumberStyles.HexNumber)); 
Array.Reverse(raw); 
float f = BitConverter.ToSingle(raw, 0); 

但這是非常慢。我曾嘗試使用here 和使用查表和C#指針的代碼進行優化,並調用它是這樣的:

byte[] raw = FastHex.FromHexString(hex); 
float f = BitConverter.ToSingle(raw, 0); 

這是偉大的hext到字節[]轉換,但仍然涉及非本地byte []數組的創建和銷燬。我想知道我是否可以直接從字節[]到FromHexString()代碼末尾的「float」值。也就是說,我希望能夠做到:

fixed (float* floatptr = (float*)result) 
    return *floatptr; 

,其中結果是[4]包含結果的字節,但C#不喜歡......有沒有更好的辦法?

+0

所以你的十六進制字符串都在MSB到LSB的順序? –

+0

他們來自運行在英特爾PC上的外部應用程序.Python的「 rivimey

回答

0

我想這可能做的伎倆:

float f = (float)System.Net.IPAddress.NetworkToHostOrder(
    BitConverter.ToInt32(bytes, 0)); 
+0

- 就字節數轉換爲浮點而言,我的意思是。 –

0
 // This works for a two byte string, possibly more ;-) 
     string hex = "FF"; 
     // 
     float f = (float) Convert.ToInt32(hex, 16); 
     // 
     // f is now 255, yahoo! 
相關問題