在Python中计算CRC16

2024-04-25 07:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用crcmodPython模块和2.7版本的Python解释器根据CRC-16算法计算适当的校验和。校验和参数为:

  • CRC命令:16
  • CRC多项式:0x8005
  • 初始值:0xFFFF
  • 最终值:0x0000
  • 直接:正确

代码:

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


Tags: 模块代码命令版本算法false参数rev
3条回答

def crc16(数据:bytearray,偏移量,长度): 如果数据为“无”或“偏移”<;0或“偏移”>;长度(数据)-1和“偏移”+“长度”>;长度(数据): 返回0 打印(“uzunluk=”,len(数据)) 打印(数据)

crc = 0xFFFF
for i in range(0, length):
    crc ^= data[offset + i]
    for j in range(0,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

下面是CRC-16/CCITT-FALSE的python实现

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
  • 数据:要计算CRC的数据的数组
  • 偏移量:要从哪个偏移量开始计算CRC
  • 长度:要计算CRC的偏移量

crcmod工作正常。你给它的不是你认为给它的三个字节。你的str(int(0x5A0001))提供了7个字节,这是ASCII字符58982410x5a0001转换为十进制。

要给它输入字节0x5a 0x00 0x01,您可以(作为一种方法):

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

打印0xace

相关问题 更多 >