Правильная реализация Python crc_hqx(data, value)
Решено! Спасибо, rcgdlr.
Я только узнаю о CRC и не уверен, что моя реализация верна. У меня есть ряд вопросов:
- Включаю ли я crc в часть данных (полагаю, что да, но я не уверен; может ли это зависеть от реализации)?
bytes_trans = cmd_in [5: -2] # -2 для включения crc или -4 для исключения crc?
Как мне определить мое начальное значение? Большинство реализаций, которые я видел онлайн, либо использовали 0, либо передавали сам crc. Я попробовал эти два метода:
crc_start = int.from_bytes (cmd_in [-4: -2], byteorder = 'little', подписано =False) # CRC из сообщения
crc = binascii.crc_hqx (bytes_trans, crc_start)
crc2 = binascii.crc_hqx (bytes_trans, 0)
Как я знаю, когда это работает? Я полагаю, что я ищу 0 или целое число, соответствующее CRC?
До сих пор я не добился успеха, что говорит о том, что я использую неправильные входные данные, или CRC на самом деле не является CCITT CRC-16, как указано в документации, из которой я работаю. Я пробовал большинство реализаций PyCRC, например DNP и Kermit, но также не повезло. Есть ли способ подтвердить, что я действительно работаю с CCITT CRC-16? Существуют ли факторы, которые могли бы быть реализованы по-другому, делая этот слегка модифицированный CCITT CRC-16?
1 ответ
Обычно к данным добавляется CRC, в первую очередь старший байт.
Начальное значение зависит от конкретной реализации. Для 16-битного CRC два наиболее распространенных значения - 0x0000 или 0xffff. В некоторых случаях используются другие значения, наиболее распространенные из которых будут эквивалентны начальному значению 0x0000 и генерируются в CRC для двухбайтовой строки данных 0xff, 0xff, как если бы к данным был добавлен префикс с двухбайтовым шаблоном 0xff 0xff.
Чтобы проверить вашу реализацию CRC, вы можете сравнить ее с одним из CRC с веб-сайта, такого как:
https://www.lammertbies.nl/comm/info/crc-calculation.html
Использование шестнадцатеричной опции ввода более гибко. При сравнении своей реализации не добавляйте рассчитанный CRC к данным при вводе данных в поле ввода веб-сайта.