Существует более одного CRC-16. 22 каталогизировано в http://reveng.sourceforge.net/crc-catalogue/16.htm. CRC характеризуется его шириной, полиномом, начальным состоянием и порядком входных и выходных битов.
Применяя одни и те же данные к каждой из ваших функций:
Python:
data = bytes([0x01, 0x23, 0x45, 0x67, 0x89])
print ( hex(crc16(data)) )
Результат: 0x738E
C:
char data[] = {0x01, 0x23, 0x45, 0x67, 0x89};
printf ("%4X\n", get_crc16 (data, sizeof (data), 0xffffu));
Результат: 0x9F0D
, а также применение тех же данных к онлайн-инструменту, который генерирует несколько CRC, таких как https://crccalc.com/, которые вы можетеидентифицируйте CRC из результата.
В этом случае ваш код Python равен CRC-16-CCITT-FALSE , а результат C соответствует CRC-16 / MCRF4XX ,Они оба имеют один и тот же полином, но различаются по своим входным и выходным отраженным параметрам (как false для CCITT, так и true для MCRF4XX). Это означает, что для MCRF4XX биты сначала считываются из LSB, и весь CRC полностью инвертируется на выходе.
https://pypi.org/project/crccheck/ поддерживает и CCITT, и MCRF4XX, и многие другие.