我正在尝试计算m总线数据帧的校验和。在此PDF的第1页中,我能够读取到帧的校验和“是根据上述数据的算术和计算得出的,而没有考虑进位数字”。我上面的数据是字节: Field
CI Field
校验和
停止

在第二页中,我们可以找到一个有效数据帧的示例:

68 03 03 68 53 01 BB 0F 16


以十六进制表示,校验和为0F。不幸的是,我一定做错了事,因为我无法达到该值。

有人可以解释一下该算法如何找到校验和?

#1 楼

仅有一个样本永远不足以回答校验和查询,您需要一堆样本进行核对并找到模式

,所以查看链接的pdf似乎很清楚

跳过开始并求和数据并提取至少两个字节

skip     sum     mask 
x,x,x,x | y,y,... 0x000000ff = checksum

,所以您发布的示例将是

skip         | sum            
68 , 3 ,3 68 | 53 , 01 , bb |  =


checksum

"{0:X2}" -f ((0x53+0x1+0xbb) -band 0x000000ff) = 0x0f seems to match 


在pdf中的其他序列上运行此程序似乎很合算

PS C:\> $a = "{0:X2}" -f ((0x53+0xfe+0x51+0x01+0x7a+0x01) -band 0x000000ff) ; $a
1E 
PS C:\> $a = "{0:X2}" -f ((0x73+0x01+0x51+0x01+0x7A+0x02 ) -band 0x000000ff) ; $a
42