2020-09-15 03:33:59 +02:00
|
|
|
"""Helper functions."""
|
2020-09-17 02:35:09 +02:00
|
|
|
from ctypes import c_ushort
|
|
|
|
|
|
|
|
|
2020-09-20 11:16:49 +02:00
|
|
|
def calculate_crc16(input_data: bytes) -> int:
|
|
|
|
"""Calculate the CRC-16 of a byte string."""
|
2020-09-17 02:35:09 +02:00
|
|
|
crc16_tab = []
|
|
|
|
crc16_constant = 0xA001
|
|
|
|
|
|
|
|
for i in range(0, 256):
|
|
|
|
crc = c_ushort(i).value
|
|
|
|
for j in range(0, 8):
|
|
|
|
if crc & 0x0001:
|
|
|
|
crc = c_ushort(crc >> 1).value ^ crc16_constant
|
|
|
|
else:
|
|
|
|
crc = c_ushort(crc >> 1).value
|
|
|
|
crc16_tab.append(hex(crc))
|
|
|
|
|
2020-09-20 11:16:49 +02:00
|
|
|
crcValue = 0xFFFF
|
|
|
|
|
|
|
|
for c in input_data:
|
|
|
|
tmp = crcValue ^ c
|
|
|
|
rotated = c_ushort(crcValue >> 8).value
|
|
|
|
crcValue = rotated ^ int(crc16_tab[(tmp & 0x00FF)], 0)
|
|
|
|
|
|
|
|
return crcValue
|