2016-02-04 203 views
0

我试图根据CRC-16算法使用crcmod Python模块和Python版本的Python解释器来评估适当的校验和。校验参数为:在Python中计算CRC16

  • CRC顺序:16
  • CRC多项式:0x8005
  • Inital值:0xFFFF的
  • 终值:0×0000
  • 直接:真

代码:

crc16 = crcmod.mkCrcFun(0x18005, rev=False, initCrc=0xFFFF, xorOut=0x0000) 
print hex(crc16(str(int(0x5A0001)))) 

和输入0x5A0001它打印0x7E16,而我应该得到像0xCE0A

我检查了http://www.lokker.net/Java/crc/CRCcalculation2.htm,计算出的值是0xACE,这是正确的(相对于订单)。

+2

看起来您在Python代码中拥有'0x18005'作为多项式,但是您在上面的校验和参数中列出了'0x8005'。 – daveydave400

+0

不,'0x18005'对于'crcmod'是正确的。该包从整个多项式中确定CRC的位数。提供没有高项的CRC多项式是常见的,例如, '0x8005'并单独指定它是一个16位的CRC。 –

+0

首先,您创建了'c16',然后尝试使用'crc16'。你的意思是'c16'?其次,你认为你究竟是在计算CRC的?你知道'str(int(0x5A0001))'返回ASCII数字字符串'5898241',是吗?你输入了什么网络CRC计算器? –

回答

2

crcmod工作正常。你没有给它三个字节,你认为你给它。您的str(int(0x5A0001))提供七个字节,它们是ASCII字符5898241 - 将0x5a0001转换为十进制。

给它字节0x5a 0x00 0x01,你将代替(作为一种方法):

print hex(crc16("5a0001".decode("hex"))) 

,打印0xace

+0

谢谢马克!现在正在计算crc。是否有可能表示这3个单独的字节:** 0x5a ** ** 0x00 ** ** 0x01 **作为一个整数或我缺少什么? – Qrlet

+0

当然,你可以写一些东西从整数“0x5a0001”中提取这三个字节,例如(x >> 16)&0xff',(x >> 8)&0xff'和'x&0xff'。但你为什么要这么做? –

+0

我正在考虑如何在不使用'.decode(str)'的情况下将0x5a0001'划分为3个字节。换句话说,我如何计算'0x5a00'和'0x01'的校验和? – Qrlet