def cal_crc8(data): ''' 计算1字节数据的CRC8 ''' crc = data poly = 0x31 #0x07 # 多项式x^8 + x^2 + x^1 + 1,即0x107,(根据原理)省略了最高位1而得0x07 for i in range(8,0,-1): if ((crc & 0x80) >> 7) == 1: # 判断最高位是否为1,如果是需要异或,否则仅左移 crc = (crc << 1) ^ poly else: crc = (crc << 1) return crc & 0xFF # 计算后需要进行截取 def crc8(datas): ''' 计算数据的CRC8校验码 ''' length = len(datas) crc = 0x00 for i in range(length): if i == 0: crc = cal_crc8(datas[0]) # 先计算第1个数据的CRC8 else: crc = (crc ^ datas[i]) & 0xFF # 其余的均将上次的CRC8结果与本次数据异或 crc = cal_crc8(crc) # 再计算CRC8 return crc & 0xFF def crc16(datas): crc = 0xFFFF for pos in datas: crc ^= pos for i in range(8): if((crc & 1) != 0): crc >>= 1 crc ^= 0xA001 else: crc >>= 1 # return ((crc & 0xff) << 8) + (crc >> 8) return crc def add8(datas): crc = 0x00 for data in datas: crc = crc + data return crc&0xFF def checkValue_Tbus(data: bytes) -> int: crc = 0xFFFF length = len(data) if length % 2 != 0: return 0 for i in range(0, length, 2): val = data[i] * 256 + data[i + 1] crc = crc ^ val return crc