def crc8_update( crc , data ): t = data ^ crc n0 = ( ( t & 0b100000 ) >> 5 ) ^ ( ( t & 0b10000 ) >> 4 ) ^ ( ( t & 0b100 ) >> 2 ) ^ ( ( t & 0b1 ) ) n1 = ( ( t & 0b1000000 ) >> 6 ) ^ ( ( t & 0b100000 ) >> 5 ) ^ ( ( t & 0b1000 ) >> 3 ) ^ ( ( t & 0b10 ) >> 1 ) n2 = ( ( t & 0b10000000 ) >> 7 ) ^ ( ( t & 0b1000000 ) >> 6 ) ^ ( ( t & 0b100000 ) >> 5 ) ^ ( ( t & 0b1 ) ) n3 = ( ( t & 0b10000000 ) >> 7 ) ^ ( ( t & 0b1000000 ) >> 6 ) ^ ( ( t & 0b100000 ) >> 5 ) ^ ( ( t & 0b10000 ) >> 4 ) ^ ( ( t & 0b100 ) >> 2 ) ^ ( ( t & 0b10 ) >> 1 ) ^ ( ( t & 0b1 ) ) n4 = ( ( t & 0b10000000 ) >> 7 ) ^ ( ( t & 0b1000000 ) >> 6 ) ^ ( ( t & 0b100000 ) >> 5 ) ^ ( ( t & 0b1000 ) >> 3 ) ^ ( ( t & 0b100 ) >> 2 ) ^ ( ( t & 0b10 ) >> 1 ) n5 = ( ( t & 0b10000000 ) >> 7 ) ^ ( ( t & 0b1000000 ) >> 6 ) ^ ( ( t & 0b10000 ) >> 4 ) ^ ( ( t & 0b1000 ) >> 3 ) ^ ( ( t & 0b100 ) >> 2 ) n6 = ( ( t & 0b10000000 ) >> 7 ) ^ ( ( t & 0b1000 ) >> 3 ) ^ ( ( t & 0b100 ) >> 2 ) ^ ( ( t & 0b1 ) ) n7 = ( ( t & 0b10000 ) >> 4 ) ^ ( ( t & 0b1000 ) >> 3 ) ^ ( ( t & 0b10 ) >> 1 ) n = n0 | ( n1 << 1 ) | ( n2 << 2 ) | ( n3 << 3 ) | ( n4 << 4 ) | ( n5 << 5 ) | ( n6 << 6 ) | ( n7 << 7 ) return n crc = 0 crc = crc8_update( crc , 0x00 ) crc = crc8_update( crc , 0x00 ) crc = crc8_update( crc , 0x01 ) crc = crc8_update( crc , 0xf1 ) crc = crc8_update( crc , 0x00 ) crc = crc8_update( crc , 0x00 ) crc = crc8_update( crc , 0x1d ) crc = crc8_update( crc , 0x10 ) crc = crc8_update( crc , 0x20 ) crc = crc8_update( crc , 0x00 ) crc = crc8_update( crc , 0x1d ) crc = crc8_update( crc , 0x10 ) crc = crc8_update( crc , 0x20 ) crc = crc8_update( crc , 0x00 ) print 'CRC = {0:04x}'.format(crc)