1
0
mirror of https://github.com/mjg59/python-broadlink.git synced 2024-11-21 22:51:41 +01:00

Segregate CRC16.get_table() from CRC16.calculate() (#567)

This commit is contained in:
Felipe Martins Diel 2021-04-01 20:32:36 -03:00 committed by Felipe Martins Diel
parent 4e1e690762
commit 67b674859f

View File

@ -2,7 +2,7 @@
import typing as t
class CRC16: # pylint: disable=R0903
class CRC16:
"""Helps with CRC-16 calculation.
CRC tables are cached for performance.
@ -11,13 +11,8 @@ class CRC16: # pylint: disable=R0903
_cache = {}
@classmethod
def calculate(
cls,
sequence: t.Sequence[int],
polynomial: int = 0xA001, # Modbus CRC-16.
init_value: int = 0xFFFF,
) -> int:
"""Calculate the CRC-16 of a sequence of integers."""
def get_table(cls, polynomial: int):
"""Return the CRC-16 table for a polynomial."""
try:
crc_table = cls._cache[polynomial]
except KeyError:
@ -31,7 +26,17 @@ class CRC16: # pylint: disable=R0903
remainder = remainder >> 1
crc_table.append(remainder)
cls._cache[polynomial] = crc_table
return crc_table
@classmethod
def calculate(
cls,
sequence: t.Sequence[int],
polynomial: int = 0xA001, # CRC-16-ANSI.
init_value: int = 0xFFFF,
) -> int:
"""Calculate the CRC-16 of a sequence of integers."""
crc_table = cls.get_table(polynomial)
crc = init_value
for item in sequence:
crc = crc >> 8 ^ crc_table[(crc ^ item) & 0xFF]