我的代码中有这一行,我似乎无法理解它的工作原理-(为了找到我的问题)
0- (277 in HEX mode 256)
我知道结果应该是89
checksum = 0- (277(16) mode 256)
但我不记得为什么
这是C#
byte[] ByteMessage = {0x30 , 0x31 , 0x48 , 0x41 , 0x4E , 0X4F , 0X56 , 0X45 , 0X52 , 0X03 }
byte answer = gen (ByteMessage )
public static byte gen(byte[] p)
{
byte lcs = 0;
foreach (byte b in p)
{
lcs += b;
}
lcs = (byte)(0 - lcs);
return lcs;
}
答案 0 :(得分:3)
这是一个简单的校验和。后面的数学是这样的:
gen(data) = -sum(data) mod 256
自(a + b) mod c = ((a mod c) + (b mod c)) mod c
以来,中间和已经可以以256为模减少。强制转换为byte
隐式执行256模,+=
也执行两个字节之间的操作。
最后,(byte)(0 - lcs)
对256执行求反运算。
由于x + (-x) = 0
(按定义),即使在mod-256算术中,此校验和也具有以下性质:如果将其与数据放在一起,则该组合的校验和为零。