Вам необходимо применить этот алгоритм к каждому байту вашего сообщения. Небольшое усложнение заключается в том, что алгоритм, приведенный в PDF-файле Aurora, предполагает, что вычисление выполняется с использованием 8-битной арифметики без знака. Чтобы справиться с этим в Python, мы можем использовать битовую маску 0xff. Вот слегка оптимизированная версия этого кода.
def crc_16(msg):
lo = hi = 0xff
mask = 0xff
for new in msg:
new ^= lo
new ^= (new << 4) & mask
tmp = new >> 5
lo = hi
hi = new ^ tmp
lo ^= (new << 3) & mask
lo ^= new >> 4
lo ^= mask
hi ^= mask
return hi << 8 | lo
# Test
msg = bytes.fromhex("023b010000000000")
out = crc_16(msg)
hi, lo = out >> 8, out & 0xff
print('{:04x} = {:02x} {:02x}'.format(out, hi, lo))
выход
2cff = 2c ff
Приведенный выше код работает, но существуют более простые способы вычисления CRC. И мы можем использовать таблицу для ускорения процесса, если вам нужно рассчитать много CRC.
Как упоминается в статье Википедии Проверка циклической избыточности , алгоритмы CRC обычно задаются в виде полинома, закодированного в виде шестнадцатеричного числа. Вот функция, которая делает это, используя обратное полиномиальное представление.
def crc_16_CCITT(msg):
poly = 0x8408
crc = 0xffff
for byte in msg:
for _ in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
return crc ^ 0xffff
Чтобы ускорить процесс, мы можем вычислить таблицу.
def make_crc_table():
poly = 0x8408
table = []
for byte in range(256):
crc = 0
for bit in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
table.append(crc)
return table
table = make_crc_table()
def crc_16_fast(msg):
crc = 0xffff
for byte in msg:
crc = table[(byte ^ crc) & 0xff] ^ (crc >> 8)
return crc ^ 0xffff
# Test
msg = bytes.fromhex("023b010000000000")
out = crc_16_fast(msg)
hi, lo = out >> 8, out & 0xff
print('{:04x} = {:02x} {:02x}'.format(out, hi, lo))
Если хотите, вы можете распечатать таблицу и вставить ее в свой скрипт, чтобы вам не приходилось вычислять таблицу каждый раз, когда вы запускаете скрипт.