2014-07-25 57 views
0

我想我真正感受到雙精度數字的最好方法就是和他們一起玩,我想做的事情之一是看他們(幾乎)二進制表示。爲此,在C#中,函數BitConverter.DoubleToInt64Bits非常有用,因爲它(在轉換爲十六進制之後)讓我看看浮點數的「真實」性質。BitConverter.DoubleToInt64Bits在Python中相當於

問題是,我似乎無法在Python中找到等效函數,是否有辦法在python函數中執行與BitConverter.DoubleToInt64Bits相同的操作?

謝謝。


編輯:

的回答波紋管建議usinginascii.hexlify(struct.pack('d', 123.456)的雙重轉換爲十六進制表示的,但我仍然得到奇怪的結果。

例如,

inascii.hexlify(struct.pack('d', 123.456)) 

確實做回'77be9f1a2fdd5e40',但如果我運行代碼,應在C#等同,即

BitConverter.DoubleToInt64Bits(123.456).ToString("X") 

我得到一個完全不同的數字:"405EDD2F1A9FBE77"。我在哪裏犯了我的錯誤?

+0

它們並不完全不同。它們是相反的順序相同的字節。 405EDD2F1A9FBE77更有用,因爲它按照與IEEE 754規範相同的順序將字節顯示爲十六進制數字對,所以我會嘗試將數據轉換爲該順序。 –

回答

2

如何使用struct.packbinascii.hexlify

>>> import binascii 
>>> import struct 
>>> struct.pack('d', 0.0) 
'\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> binascii.hexlify(struct.pack('d', 0.0)) 
'0000000000000000' 
>>> binascii.hexlify(struct.pack('d', 1.0)) 
'000000000000f03f' 
>>> binascii.hexlify(struct.pack('d', 123.456)) 
'77be9f1a2fdd5e40' 

結構格式指定d表示double C型(8個字節= 64位)。其他格式請參閱Format characters

UPDATE

通過指定@=<>!作爲格式的第一個字符,你可以指示字節順序。 (Byte Order, Size, and Alignment

>>> binascii.hexlify(struct.pack('<d', 123.456)) # little-enddian 
'77be9f1a2fdd5e40' 
>>> binascii.hexlify(struct.pack('>d', 123.456)) # big-endian 
'405edd2f1a9fbe77' 
+0

我編輯了我的問題來解釋我有什麼問題。 – 5xum

+0

@ 5xum,我更新了答案。一探究竟。 – falsetru

+0

非常感謝!工作正常! – 5xum