2012-05-22 143 views
2

我正在讀取二進制文件中的數據。我有一個文件讓我知道信息是如何存儲的。爲了確保這一點,我使用XVI32。十六進制十進制浮點數Python

我正在正確提取信息字符串和int數據,直到我碰到float數據類型。

根據這個文件:

00800000 = 0.0 
7AFBDD35 = 0.061087 
9BF7783C = -0.003491 
00FBFCAD = 0.031416 

我試圖來解決這個問題:

struct.unpack('!f', my_float.decode('hex'))[0] 

等不同方式....

我測試了一些在線工具信息如: http://babbage.cs.qc.cuny.edu/IEEE-754/index.xhtmlhttp://www.binaryconvert.com/result_float.html?decimal=048046048054049048056055,但所有這些方式都會根據原始結果給我一個不同的值。

我開始懷疑float信息被加密或類似的東西,但爲什麼字符串和int未加密?

+0

我可以看到這些數字沒有模式。你試過的(加上玩字節順序)是我所期望的。你給的價值似乎沒有以我能看到的任何一致的方式來安排。你確定他們是對的嗎? –

+1

你能提供更多的例子嗎?在你展示的少數人中很難看到一種模式。 –

+4

等待,文檔真的只是給你這四個例子,並期望從這個模式清楚?它沒有引用其他一些標準或任何東西? '7AFBDD35'中的 –

回答

2

有趣的謎題。處理文件我想出了這個:

def byteswap(x): 
    return ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8) 


def tms320_float(raw): 
    s = (raw >> 23) & 1 
    mantissa = (raw & 0x007fffff) 
    exponent = raw >> 24 
    if exponent >= 128: 
     exponent -= 256 
    if exponent == -128: 
     return 0.0 
    return (((-2) ** s) + float(mantissa)/float(1 << 23)) * (2.0 ** exponent) 

>>> tms320_float(byteswap(0x00800000)) 
0.0 
>>> tms320_float(byteswap(0x7AFBDD35)) 
0.06108652427792549 
>>> tms320_float(byteswap(0x9BF7783C)) 
-0.003490658476948738 
>>> tms320_float(byteswap(0x00FBFCAD)) 
0.031415924429893494 
+0

我發現stackoverflow.com不可思議的人們提供了強大的編程水平,就像你先生! –

1

我老闆給我回答,浮點數據不是IEEE格式。

的數據類型是出於某種原因TMS320浮點

,從十六進制數據的實際值混合2個字節,我的意思是:

80000000 = 0.0 
FB7A35DD = 0.061087 
F79B3C78 = -0.003491 
FB00ADFC = 0.031416 

三江源支持我的人

+0

TMS320浮點數的文件在這裏:http://www.ti.com/lit/an/spra400/spra400.pdf,正如我在OP的評論中所說的,第一個2個十六進制的dights是指數。 **但是**,0.031416的指數怎麼會是'00'?我必須再問一次:**你確定他們是對的嗎?你在玩我們嗎?** – Skyler

+0

我仍然在研究該文件的信息,現在我已經具有將表示TMS320浮點格式號碼的無符號值轉換爲IEEE浮點格式值的功能,我會理解這些值是否正確。我會確定爲什麼這些值的結果。我不和你一起玩,我很認真。 –

+0

從十六進制數據的實際值混合2個字節:所有天 8000 = 0.0 FB7A35DD = 0.061087 F79B3C78 = -0.003491 FB00ADFC = 0.031416K –