# # HorusLib - Checksumming functions # import crcmod import logging import struct def ukhas_crc(data:bytes) -> str: """ Calculate the CRC16 CCITT checksum of *data*. (CRC16 CCITT: start 0xFFFF, poly 0x1021) """ crc16 = crcmod.predefined.mkCrcFun('crc-ccitt-false') return hex(crc16(data))[2:].upper().zfill(4) def check_packet_crc(data:bytes, checksum:str='crc16'): """ Attempt to validate a packets checksum, which is assumed to be present in the last few bytes of the packet. Support CRC types: CRC16-CCITT """ if (checksum == 'crc16') or (checksum == 'CRC16') or (checksum == 'crc16-ccitt') or (checksum == 'CRC16-CCITT'): # Check we have enough data for a sane CRC16. if len(data) < 3: raise ValueError(f"Checksum - Not enough data for CRC16!") # Decode the last 2 bytes as a uint16 _packet_checksum = struct.unpack('