40 lines
678 B
Python
40 lines
678 B
Python
from __future__ import annotations
|
|
|
|
CRC_TABLE = (
|
|
0x0000,
|
|
0xCC01,
|
|
0xD801,
|
|
0x1400,
|
|
0xF001,
|
|
0x3C00,
|
|
0x2800,
|
|
0xE401,
|
|
0xA001,
|
|
0x6C00,
|
|
0x7800,
|
|
0xB401,
|
|
0x5000,
|
|
0x9C01,
|
|
0x8801,
|
|
0x4400,
|
|
)
|
|
|
|
|
|
def update_crc(crc: int, byte: int) -> int:
|
|
tmp = CRC_TABLE[crc & 0xF]
|
|
crc = (crc >> 4) & 0x0FFF
|
|
crc = crc ^ tmp ^ CRC_TABLE[byte & 0xF]
|
|
|
|
tmp = CRC_TABLE[crc & 0xF]
|
|
crc = (crc >> 4) & 0x0FFF
|
|
crc = crc ^ tmp ^ CRC_TABLE[(byte >> 4) & 0xF]
|
|
return crc & 0xFFFF
|
|
|
|
|
|
def fit_crc(data: bytes | bytearray | memoryview) -> int:
|
|
crc = 0
|
|
for byte in data:
|
|
crc = update_crc(crc, byte)
|
|
return crc
|
|
|