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终端上给出了正确的输出时给出了垃圾值?最糟糕的是文件被破坏了..
答案 0 :(得分:3)
如果您想了解“垃圾”(您的摘要!)来自哪里的更多线索,请尝试print k
与print 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 :(得分:1)
一种可能性是您在Windows上并且未以二进制模式正确打开文件,即'wb'
。我们无法分辨,因为您没有告诉我们您如何打开f
。
另一种可能性是你在使用Python 3(其中str
表示unicode),但我认为在这种情况下,当你显示b
时,你会看到一个领先的k
(并且Python 3的标准库中没有md5
模块。)
以正确的方式打开文件,在Mac上使用Python 2.6.4,我将摘要视为
'\x82s\xf9\xa4\x83\x04\x87\xd0\xfdg\xee\xfa\x1f\x05B>'
作为k
和文件的内容。顺便说一下,我不知道为什么你会看到不同的东西;我在Python 2.4和2.5中得到了相同的结果。