[tips] crc32 in python
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)).value
ex1 = "12345"
ex2 = "1kcaseztsa12345azy"
print "%x" % zlib.crc32(ex1)
print crc32_c(ex1)
print "%x" % zlib.crc32(ex2)
print crc32_c(ex2)
註: python 3.0以上沒有這個問題.