2016-11-22 14 views
3

我需要計算md5哈希的隨機8字節長的數字,所以我要把它打包:如何收拾很大的負面長二進制字符串在Python

import struct 

num = 123L 
bin = struct.pack('q', num) 

工作正常,但是,對於大負值:

num = -14710095416404972671L 
bin = struct.pack('q', num) 

我得到這個錯誤:

struct.error: long too large to convert to int 
蟒蛇2.6

我可以通過哪種方式將其轉換爲用作md5散列的輸入?

+1

你似乎有一個XY問題。你更關心的是獲得'num'的有效二進制表示,還是獲得'num'的md5哈希? – RegularlyScheduledProgramming

+0

@RegularlyScheduled編程服務器端計算C++中long的二進制表示的md5散列,我需要在python中實現相同的散列。 – Slava

+0

我查了一下,果然我在散列中使用'struct.pack' vs'bin'獲得了不同的哈希值,所以我刪除了我的答案。也許看看'struct'模塊的源代碼?祝你好運。 – RegularlyScheduledProgramming

回答

1

你不能,這個數字只是不適合8字節長(簽名)。該最大價值,你可以供應'q'-2 ** 63,毫不遜色:

num = -2 ** 63 
bin = struct.pack('q', num) 

同時:

num = -2 ** 63 - 1 
bin = struct.pack('q', num) 

導致error: argument out of range。這是最高限額,使用'Q'可以實現更大的正數(無符號)值,但限制爲2 ** 64

+0

我不太明白爲什麼EB95EC9D994ED78D這個值不適合8字節?那是python的限制嗎? – Slava

+0

@Slava如果你使用格式字符作爲無符號長整型''Q'',那麼它很合適。如果使用帶有8個字節數字的「q」,則不會。 –

+0

我從C++服務器端值'-14710095416404972671L'得到的問題,代表那裏是'EB95EC9D994ED78D',我該如何從第一個開始? – Slava

1

只要您意識到MD5在任何字節流上運行,您就有多種選擇。重要的是要注意標誌對MD5無關緊要;它不解釋整數,它操縱一個流。因此,您無需關心輸入符號或轉換爲帶符號整數。你需要一個字節數組,你可以通過多種方式獲得,我的選擇是:

In [30]: 0xEB95EC9D994ED78D.to_bytes(8, 'big') 
Out[30]: b'\xeb\x95\xec\x9d\x99N\xd7\x8d' 

將處理的限制Python的整數允許範圍內任意整數。

相關問題