2012-07-06 212 views
2

我使用PyCrypto和python 2.7.3。我試圖在散列前加一個常規字符串來創建一個鏈式散列,但爲了保持格式一致,我需要字符串s在'打印'形式而不是二進制形式。有沒有辦法將二進制字符串轉換爲可操作的「普通」字符串?將字節字符串轉換爲python中的字符串

from Crypto.Hash import SHA256 
h = SHA256.new() 
s = h.digest() #return binary "non-printable" digest 

s 
>>>"\xe3\xb0\xc4B\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99o\xb9$'\xaeA\xe4d\x9b\x93L\xa4\x95\x99\x1bxR\xb8U" 
print(s) 
>>> ã°ÄB˜üšûôÈ™o¹$'®Aäd›「L¤•™xR¸U 

感謝所有幫助

回答

4

你看到的在交互式解釋進入s當是字符串的表示。你不應該關心這看起來像什麼 - 實際的字符串內容是當你使用print時打印的內容。由於字符串已有具有該內容,因此無法將該字符串「轉換」爲使用print時打印的內容。

+0

啊,謝謝!這很有道理! – poop 2012-07-06 21:19:53

1

嘗試使用.hexdigest()代替。您將獲得十六進制數字的字符串表示形式。

1

不知道如果我得到你的權利,但如果你的意思是一個十六進制表示你可以看到binascii -module在std-lib中的:

from binascii import b2a_hex #bin to ascii: hex-format 
print b2a_hex(s) 
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 

,如果你只是想在前面加上一個字符串S,它就像斯文Marnach說,不要打擾什麼 印刷,只是追加s到您的前綴,如:

prefix = 'username:' 
combined_string = prefix + s