在 Python 中计算 CRC16

Calculating CRC16 in Python

我正在尝试使用 crcmod Python 模块和 Python 的 2.7 版本基于 CRC-16 算法评估适当的校验和口译员。校验和参数为:

代码:

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,这是正确的(关于顺序)。

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

要向它提供字节 0x5a 0x00 0x01,您可以改为(作为一种方法):

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

打印 0xace.

这是 python 实现 CRC-16/CCITT-FALSE

def crc16(data : bytearray, offset , length):
    if data is None or offset < 0 or offset > len(data)- 1 and offset+length > len(data):
        return 0
    crc = 0xFFFF
    for i in range(0, length):
        crc ^= data[offset + i] << 8
        for j in range(0,8):
            if (crc & 0x8000) > 0:
                crc =(crc << 1) ^ 0x1021
            else:
                crc = crc << 1
    return crc & 0xFFFF
  • data : 要计算 CRC 的数据的字节数组
  • 偏移量:您要从哪个偏移量开始计算 CRC
  • length : 要计算 CRC 的偏移量
def crc16(data : bytearray, offset, length):
    if data is None or offset < 0 or offset > len(data) - 1 and offset + length > len(data):
        return 0
    print("uzunluk=", len(data))
    print(data)

    crc = 0xFFFF
    for i in range(length):
        crc ^= data[offset + i]
        for j in range(8):
            print(crc)
            if ((crc & 0x1) == 1):
                print("bb1=", crc)
                crc = int((crc / 2)) ^ 40961
                print("bb2=", crc)
            else:
                crc = int(crc / 2)
    return crc & 0xFFFF

基于 pycrc 代码的 CRC-16-ANSI、CRC-16-IBM 的工作单函数示例。

易于修改,但不包括输入或输出反射功能:

def crc16(data: bytes):
    xor_in = 0x0000  # initial value
    xor_out = 0x0000  # final XOR value
    poly = 0x8005  # generator polinom (normal form)

    reg = xor_in
    for octet in data:
        # reflect in
        for i in range(8):
            topbit = reg & 0x8000
            if octet & (0x80 >> i):
                topbit ^= 0x8000
            reg <<= 1
            if topbit:
                reg ^= poly
        reg &= 0xFFFF
        # reflect out
    return reg ^ xor_out