不同的crc16 C和Python3吗?

问题描述 投票:-2回答:1

我有两个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
python c converters crc16
1个回答
3
投票

[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。它们都具有相同的多项式,但是它们的输入反映和输出反映参数不同(CCITT为false,MCRF4XX为true)。这意味着对于MCRF4XX,首先从LSB读取这些位,然后在输出上反转整个CRC。

[https://pypi.org/project/crccheck/支持CCITT和MCRF4XX等。

© www.soinside.com 2019 - 2024. All rights reserved.