2010-05-04 19 views
2
m=md5.new() 
a=10111011 
>>> m.update(str(a)) 
>>> k=m.digest() 
>>> k 
'\xec\x9d1\x89e\x08\xa1\xc2Y\xf6\xbf6\xfe\xe4\xe2M' 
>>> f.write(str(k)) 
>>> f.flush() 

文件f被填充了垃圾值,我無法再使用它來再次讀取以進一步使用散列。爲什麼它會在python終端上給出正確的輸出時的垃圾值?最糟糕的部分是文件損壞..在試圖在python文件中存儲md5散列時給出垃圾值

回答

3

如果你想要更多的線索,你的「垃圾」(你的摘要!)來自哪裏,請試試print kprint repr(k)

您有一個原始字節字符串。我想你想插入一個hexdigest呢?請使用k = m.hexdigest()k = repr(m.digest())並將其寫入您的文件。

基本上,你可以選擇你的表示,選擇你寫入你的文件。你想看哪些?

>>> print k 
�1���Y�6���M 
>>> print repr(k) 
'\xec\x9d1\x89e\x08\xa1\xc2Y\xf6\xbf6\xfe\xe4\xe2M' 
>>> print k.encode("hex") 
ec9d31896508a1c259f6bf36fee4e24d 

與f.write(..)完全相同,如同打印一樣。正如你所看到的,在原來的版本中,你使用'k'('str(k)'與'k'相同)

1

一種可能性是您在Windows上並沒有正確打開文件二進制模式,即爲'wb'。我們不能說,因爲你沒有告訴我們你如何打開f

另一種可能性是,你是對的Python 3(str意味着Unicode)的,但我認爲在這種情況下,你會看到一個領先的b當你告訴k(而且也沒有md5模塊在Python 3標準庫)。

打開文件的正確方法,用在Mac上的Python 2.6.4,我看到了作爲消化

'\x82s\xf9\xa4\x83\x04\x87\xd0\xfdg\xee\xfa\x1f\x05B>' 

既是k和文件的內容。順便說一句,我不知道你爲什麼看到不同的東西;我得到了與Python 2.4和2.5相同的結果。

+0

我在Linux上使用Python 2.6 .. – Hick 2010-05-04 16:14:01

+0

現在嘗試在Linux上,與我的回答相同的結果,無論是'k'還是文件內容 - 也就是說,您的問題無法複製。嘗試製作一個完整的,自包含的腳本(包括文件的打開和關閉)來重現您的問題,並編輯您的問題以顯示問題的這種自包含的複製,而不是一個不完整的片段(本身,假設所有周圍的代碼是正確的)沒有錯誤。你可以在我給出的代碼中看到 – 2010-05-04 16:20:39

+0

。我已經在Python終端中輸入了它。所以它非常精簡的版本..我得到的是這個 ZV a e젳| 1 e Y 6 M 即使我改變它wb .. – Hick 2010-05-04 16:30:54