отличается crc16 C и Python3? - PullRequest
       30

отличается crc16 C и Python3?

0 голосов
/ 20 октября 2019

У меня есть два калькулятора crc16 (на C и Python). Но я получаю разные результаты. Почему?

калькулятор в C:

unsigned short __update_crc16 (unsigned char data, unsigned short crc16)
{
  unsigned short t;
  crc16 ^= data;
  t = (crc16 ^ (crc16 << 4)) & 0x00ff;
  crc16 = (crc16 >> 8) ^ (t << 8) ^ (t << 3) ^ (t >> 4);
  return crc16;
}


unsigned short get_crc16 (void *src, unsigned int size, unsigned short start_crc)
{
  unsigned short crc16;
  unsigned char *p;
  crc16 = start_crc;
  p = (unsigned char *) src;
  while (size--)
    crc16 = __update_crc16 (*p++, crc16);
  return crc16;
}

калькулятор в Python3:

def crc16(data):
    crc = 0xFFFF
    for i in data:
        crc ^= i << 8
        for j in range(0,8):
            if (crc & 0x8000) > 0:
                crc =(crc << 1) ^ 0x1021
            else:
                crc = crc << 1
    return crc & 0xFFFF

1 Ответ

4 голосов
/ 20 октября 2019

Существует более одного 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, и многие другие.

...