Python crc_hqx(data, value) 正确执行

Python crc_hqx(data, value) proper implementation

已解决!谢谢 rcgdlr。

我刚刚了解 CRC,不确定我的实施是否正确。我有很多问题:

  1. 我是否将 crc 包含在数据部分中(我相信是的,但我不确定;它是否取决于实现)?

bytes_trans = cmd_in[5:-2] # -2 包含 crc 或 -4 不包含 crc?

  1. 如何确定我的初始值?我在网上看到的大多数实现要么使用 0,要么通过 crc 本身。我试过这两种方法:

    crc_start = int.from_bytes(cmd_in[-4:-2], byteorder='little', signed=False) # 来自消息的CRC

    crc = binascii.crc_hqx(bytes_trans, crc_start)

    crc2 = binascii.crc_hqx(bytes_trans, 0)

  2. 我怎么知道它什么时候起作用?我相信我正在寻找一个 0 或一个与 CRC 匹配的整数?

  3. 到目前为止我还没有成功,这表明我使用了错误的输入或者 CRC 实际上不是我正在使用的文档中指定的 CCITT CRC-16。我已经尝试过大多数 PyCRC 实现,例如DNP 和 Kermit 但也没有运气。有没有办法确认我确实在使用 CCITT CRC-16?是否存在可以以不同方式实施的因素,使其成为略微修改的 CCITT CRC-16?

通常 CRC 附加到数据,最高有效字节在前。

初始值取决于具体实现。对于 16 位 CRC,两个最常见的值是 0x0000 或 0xffff。在某些情况下,会使用其他值,其中最常见的值相当于初始值 0x0000,并在 CRC 处为两字节数据字符串 0xff、0xff 生成,就好像数据以两字节模式 0xff 为前缀一样, 0xff.

要检查您的 CRC 实施,您可以将其与来自网站的其中一个 CRC 进行比较,例如:

https://www.lammertbies.nl/comm/info/crc-calculation.html

使用十六进制输入选项更灵活。比较您的实施时,不要在网站输入框中输入数据时将计算出的 CRC 附加到数据。