我想要计算文件的CRC并得到类似于:E45A12AC
的输出。下面是我的代码:
#!/usr/bin/env python
import os, sys
import zlib
def crc(fileName):
fd = open(fileName,"rb")
content = fd.readlines()
fd.close()
for eachLine in content:
zlib.crc32(eachLine)
for eachFile in sys.argv[1:]:
crc(eachFile)
这会计算每一行的CRC,但是它的输出(例如-1767935985
)并不是我想要的。
Hashlib按照我想要的方式工作,但它会计算md5:
import hashlib
m = hashlib.md5()
for line in open('data.txt', 'rb'):
m.update(line)
print m.hexdigest()
使用zlib.crc32
可以得到类似的结果吗?
发布于 2010-03-05 23:35:38
更紧凑和优化的代码
def crc(fileName):
prev = 0
for eachLine in open(fileName,"rb"):
prev = zlib.crc32(eachLine, prev)
return "%X"%(prev & 0xFFFFFFFF)
PS2:旧PS已弃用-因此删除了-,因为注释中的建议。谢谢。我不明白,我怎么会错过这个,但它真的很棒。
发布于 2019-09-28 04:47:09
Kobor42答案的一个修改版本,通过读取固定大小的块而不是“行”,性能提高了2-3倍:
import zlib
def crc32(fileName):
with open(fileName, 'rb') as fh:
hash = 0
while True:
s = fh.read(65536)
if not s:
break
hash = zlib.crc32(s, hash)
return "%08X" % (hash & 0xFFFFFFFF)
在返回的字符串中还包括前导零。
发布于 2009-11-16 23:43:08
要将任何整数的最低32位显示为8个无符号的十六进制数字,您可以通过位与掩码来“掩码”该值,然后应用格式化。即:
>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, '08x')
'969f700f'
这样格式化的整数是来自zlib.crc32
还是来自任何其他计算都是无关紧要的。
https://stackoverflow.com/questions/1742866
复制相似问题