binascii.crc32(s [,crc])
返回CRC32校验。参数'crc'指定初始值用于循环。例如:
Code
>>> import binascii
>>> crc = binascii.crc32('spam')
>>> binascii.crc32(' and eggs', crc)
739139840
>>> binascii.crc32('spam and eggs')
739139840
Code
import binascii
def getFileCRC(_path):
try:
blocksize = 1024 * 64
f = open(_path,"rb")
str = f.read(blocksize)
crc = 0
while(len(str) != 0):
crc = binascii.crc32(str, crc)
str = f.read(blocksize)
f.close()
except:
print 'get file crc error!'
return 0
return crc
Code
python 2.X的crc32實作上跟一般的C實作上在整數有號無號的處理上略有不同, 所以使用python 2.X與一般C實作算出的crc32(如sfv)比對時,通常需要特別的方法,
這邊列出一個透過zlib.crc32快速得到所需要結果的方法:
import zlib def crc32(st): crc = zlib.crc32(st) if crc > 0: return "%x" % (crc) else: return "%x" % (~crc ^ 0xffffffff)ex1
= "12345" ex2 = "1kcaseztsa12345azy" print "%x" % zlib.crc32(ex1) print crc32(ex1) print "%x" % zlib.crc32(ex2) print crc32(ex2)或如果你有ctypes的話:
import zlib import ctypes def crc32_c(st): return "%x" % ctypes.c_uint32(zlib.crc32(st)).valueex1
= "12345" ex2 = "1kcaseztsa12345azy" print "%x" % zlib.crc32(ex1) print crc32_c(ex1) print "%x" % zlib.crc32(ex2) print crc32_c(ex2)註: python
3.0以上沒有這個問題.
Code
from ctypes import *
import binascii
def getFileCRC(_path):
try:
blocksize = 1024 * 64
f = open(_path,"rb")
str = f.read(blocksize)
crc = 0
while(len(str) != 0):
crc = binascii.crc32(str, crc)
str = f.read(blocksize)
f.close()
except:
klog.error("get file crc error!")
return 0
return c_uint(crc).value