任何帧的相同 16 位 CRC X-25
Same 16-bit CRC X-25 for any frame
我很好奇我在开发应用程序期间所做的观察。
长话短说,我正在制作从智能电表读取数据的应用程序。他们有这样的请求框架:
7E [hex-address] [crc1] [cmd] [crc2] 7E
CRC 的算法是CRC-16/X-25,他们应该计算没有7e
的帧的整个左边部分,所以crc2
包括crc1
。我注意到 crc2
对任何 cmd
都是相同的,甚至 hex-address
也不同。
我使用 crccalc 工具来确保。重现步骤:
- 放入任何(甚至任何大小)十六进制数组
- 计算器CRC-16/X-25
- 交换 CRC 字节
- 将这个交换的 CRC 放在数组的末尾
- 再次计算 CRC
这个 CRC 对于任何字节数组都是相同的。为什么这样?这种现象有什么名字吗?
calc CRC again
如果你给数据追加一个CRC,再计算一次,结果是一个常数值。如果 CRC 不是 post 补码 (xorout = 0),结果为零,但在这种情况下它是 post 补码 (xorout = 0xffff),所以结果是 non-zero 常量,在本例中为 0x0f47(假设没有发生错误)。
我很好奇我在开发应用程序期间所做的观察。 长话短说,我正在制作从智能电表读取数据的应用程序。他们有这样的请求框架:
7E [hex-address] [crc1] [cmd] [crc2] 7E
CRC 的算法是CRC-16/X-25,他们应该计算没有7e
的帧的整个左边部分,所以crc2
包括crc1
。我注意到 crc2
对任何 cmd
都是相同的,甚至 hex-address
也不同。
我使用 crccalc 工具来确保。重现步骤:
- 放入任何(甚至任何大小)十六进制数组
- 计算器CRC-16/X-25
- 交换 CRC 字节
- 将这个交换的 CRC 放在数组的末尾
- 再次计算 CRC
这个 CRC 对于任何字节数组都是相同的。为什么这样?这种现象有什么名字吗?
calc CRC again
如果你给数据追加一个CRC,再计算一次,结果是一个常数值。如果 CRC 不是 post 补码 (xorout = 0),结果为零,但在这种情况下它是 post 补码 (xorout = 0xffff),所以结果是 non-zero 常量,在本例中为 0x0f47(假设没有发生错误)。