Python笔记–计算CRC32

之前是使用C代码计算数据的CRC32校验码,现在需要使用Python来实现。本来打算自己动手一直,搜索发现,Python的binascii模块半包含了crc32函数,通过测试发现该函数实现的CRC计算跟我说使用的CRC计算一致,其CRC多项式为:CRC-32 0x04C11DB7 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1
具体的实现方法在网上找到了一篇很好的博文,在此感谢原作者,并转载如下(因为是blogger上的,访问不方便)。同时将我的C语言实现的CRC32也附在这里 crc32_test.c
binascii模块的官方参考

—————————————-           以下为转载   查看原文       ———————————–
用 Python 計算 CRC32 很簡單,只要使用內建的 binascii 模組即可。

import binascii
print binascii.crc32("hello world")

要反覆計算的話,可以用:

crc = binascii.crc32("hello")
crc = binascii.crc32(" world", crc)

其中的第二行,將前一步驟所計算的 CRC 結果作為參數再次傳入函式中。

如果要計算檔案的 CRC32,可以透過以下函式來計算:

import binascii
def computeFileCRC(filename):
    try:
        blocksize = 1024 * 64
        f = open(filename, "rb")
        str = f.read(blocksize)
        crc = 0
        while len(str) != 0:
            crc = binascii.crc32(str,crc) & 0xffffffff
            str = f.read(blocksize)
        f.close()
    except:
        print "compute file crc failed!"
        return 0
    return crc

上面比較特別要注意的是這行:

crc = binascii.crc32(str,crc) & 0xffffffff

根據官方文件,在 Python 2.x 的版本中,binascii.crc32 所計算出來的 CRC 值域為 [-2^31, 2^31-1] 之間的有號整數,為了要與一般 C 所實作的 CRC 結果作比對,需要將其轉為無號整數,所以加上「& 0xffffffff」這段來做轉換。如果是 Python 3.x 的版本,其計算結果為 [0, 2^32-1] 間的無號整數,因此不需額外加上修正。

另外,上述 computeFileCRC 計算的結果為十進位整數,而通常見到的 CRC32 字串會以 16 進位方式表示,所以可以這樣轉換:

crcstr = hex(computeFileCRC("somefile"))[2:]

或是,如果要直接使用在字串中,也可以用 format 的方式轉換成 16 進位格式:

print ("crc32: %08x" % computeFileCRC("somefile"))
分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/python%e7%ac%94%e8%ae%b0-%e8%ae%a1%e7%ae%97crc32/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名