首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中计算文件的crc

在python中计算文件的crc
EN

Stack Overflow用户
提问于 2009-11-16 23:23:48
回答 8查看 44.9K关注 0票数 30

我想要计算文件的CRC并得到类似于:E45A12AC的输出。下面是我的代码:

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
import hashlib
m = hashlib.md5()
for line in open('data.txt', 'rb'):
    m.update(line)
print m.hexdigest()

使用zlib.crc32可以得到类似的结果吗?

EN

回答 8

Stack Overflow用户

发布于 2010-03-05 23:35:38

更紧凑和优化的代码

代码语言:javascript
复制
def crc(fileName):
    prev = 0
    for eachLine in open(fileName,"rb"):
        prev = zlib.crc32(eachLine, prev)
    return "%X"%(prev & 0xFFFFFFFF)

PS2:旧PS已弃用-因此删除了-,因为注释中的建议。谢谢。我不明白,我怎么会错过这个,但它真的很棒。

票数 32
EN

Stack Overflow用户

发布于 2019-09-28 04:47:09

Kobor42答案的一个修改版本,通过读取固定大小的块而不是“行”,性能提高了2-3倍:

代码语言:javascript
复制
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)

在返回的字符串中还包括前导零。

票数 16
EN

Stack Overflow用户

发布于 2009-11-16 23:43:08

要将任何整数的最低32位显示为8个无符号的十六进制数字,您可以通过位与掩码来“掩码”该值,然后应用格式化。即:

代码语言:javascript
复制
>>> x = -1767935985
>>> format(x & 0xFFFFFFFF, '08x')
'969f700f'

这样格式化的整数是来自zlib.crc32还是来自任何其他计算都是无关紧要的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1742866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档