0

解决了!谢谢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. 我怎么知道它什么时候起作用?我相信我正在寻找与 CRC 匹配的 0 或整数?

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

4

1 回答 1

1

通常,CRC 附加到数据中,最重要的字节在前。

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

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

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

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

于 2018-09-05T23:37:34.113 回答