class CRC(object): '''Implementation of direct table algorithm Reference: http://www.ross.net/crc/download/crc_v3.txt ''' def __init__(self, width=4, poly=0x04C11DB7, reverse=False, initial=0): self.bits = width * 8 self.initial = initial self.table = [] topbit = self.bitmask(self.bits - 1) for index in xrange(256): if reverse: index = self.reflect(index, 8) r = index << (self.bits - 8) for i in xrange(8): if r & topbit: r = (r << 1) ^ poly else: r <<= 1 if reverse: r = self.reflect(r, self.bits) self.table.append(r & ((((1 << (self.bits - 1)) - 1) << 1) | 1)) def checksum(self, *args): clear = 2 ** self.bits - 1 r = self.initial for data in args: for byte in data: r = ((r << 8) ^ self.table[(r >> 24) ^ ord(byte)]) & clear return r @classmethod def reflect(cls, v, b): t = v for i in xrange(b): if t & 1: v |= cls.bitmask((b - 1) - i) else: v &= ~cls.bitmask((b - 1) - i) t >>= 1 return v @staticmethod def bitmask(x): return 1 << x