如何在Python的crcmod库中获取CCITT-CRC16?

Sno*_*wBG 4 python python-3.x crc16

我在使用CRCMOD库获取CCITT CRC16检查的Python 3.4中编写代码时遇到问题。

那就是我的字符串:

a731986b1500087f9206e82e3829fe8bcffed5555efd00a100980000010000000100000009010013bb1d001e287107009b3000000300000088330000f427500077026309
Run Code Online (Sandbox Code Playgroud)

指定的crc值为1d7f

我的代码:

import crcmod

crc16 = crcmod.mkCrcFun(0x11021, 0x1d0f, False, 0x0000)

hex(crc16(b'a731986b1500087f9206e82e3829fe8bcffed5555efd00a100980000010000000100000009010013bb1d001e287107009b3000000300000088330000f427500077026309'))
Run Code Online (Sandbox Code Playgroud)

返回:7d67

我究竟做错了什么?

mha*_*wke 6

您首先需要将数据从其十六进制表示形式转换为二进制形式。您还需要使用正确的CRC算法,我认为它是“ xmodem”-crcmod.mkCrcFun(0x11021, 0x0000, False, 0x0000)

import crcmod.predefined
from binascii import unhexlify

s = unhexlify('a731986b1500087f9206e82e3829fe8bcffed5555efd00a100980000010000000100000009010013bb1d001e287107009b3000000300000088330000f427500077026309')

crc16 = crcmod.predefined.Crc('xmodem')
crc16.update(s)
print crc16.hexdigest()
Run Code Online (Sandbox Code Playgroud)

输出7F1D(这是您期望的,但字节反转了)