在 Python 中计算 CRC16

新手上路,请多包涵

我正在尝试使用 crcmod Python 模块和 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 是正确的(关于顺序)。

原文由 Qrlet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

要将字节 0x5a 0x00 0x01 喂给它,你会改为(作为一种方法):

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

打印 0xace

原文由 Mark Adler 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是 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

  • data :要为其计算 CRC 的数据的字节数组
  • offset :您要从哪个偏移量开始计算 CRC
  • length :要计算 CRC 的偏移量

原文由 Amin Saidani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏