gpt4 book ai didi

python - C 和 Python3 的 crc16 不同吗?

转载 作者:行者123 更新时间:2023-11-30 19:59:30 25 4
gpt4 key购买 nike

我有两个 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

最佳答案

不止一个 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 匹配。它们都具有相同的多项式,但输入反射(reflect)和输出反射(reflect)参数不同(CCITT 均为 false,MCRF4XX 均为 true)。这意味着对于 MCRF4XX,首先从 LSB 读取位,并且整个 CRC 在输出时不会反转。

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

关于python - C 和 Python3 的 crc16 不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com