用 Python 計算 CRC32 很簡單,只要使用內建的 binascii 模組即可。
1
2
| import binascii
print binascii.crc32("hello world")
|
要反覆計算的話,可以用:
1
2
| crc = binascii.crc32("hello")
crc = binascii.crc32(" world", crc)
|
其中的第二行,將前一步驟所計算的 CRC 結果作為參數再次傳入函式中。
如果要計算檔案的 CRC32,可以透過以下函式來計算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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
|
上面比較特別要注意的是這行:
1
| crc = binascii.crc32(str,crc) & 0xffffffff
|
根據官方文件,在 Python 2.x 的版本中,binascii.crc32 所計算出來的 CRC 值域為 [-231, 231-1] 之間的有號整數,為了要與一般 C 所實作的 CRC 結果作比對,需要將其轉為無號整數,所以加上 & 0xffffffff
這段來做轉換。如果是 Python 3.x 的版本,其計算結果為 [0, 232-1] 間的無號整數,因此不需額外加上修正。
另外,上述 computeFileCRC
計算的結果為十進位整數,而通常見到的 CRC32 字串會以 16 進位方式表示,所以可以這樣轉換:
1
| crcstr = hex(computeFileCRC("somefile"))[2:]
|
或是,如果要直接使用在字串中,也可以用 format 的方式轉換成 16 進位格式:
1
| print ("crc32: %08x" % computeFileCRC("somefile"))
|