55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
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 |