这个问题可能已经被问到了,但SO上的任何内容实际上都没有给我答案。
我正在尝试对其他人的vb.NET代码进行逆向工程,我仍然坚持Xor
在这里做的事情。这是一个解析的SOAP请求主体的一行(某些值已被遮盖,因此在这种情况下校验和可能不起作用):
<HD>CHANGEDTHIS01,W-A,0,7753.2018E,1122.6674N, 0.00,1,CID_V_01*3B</HD>
这是检查它的vb代码片段
LastStar = strValues(CheckLoop).IndexOf("*")
StrLen = strValues(CheckLoop).Length
TransCheckSum = Val("&h" + strValues(CheckLoop).Substring(LastStar + 1, (StrLen - (LastStar + 1))))
CheckSum = 0
For CheckString = 0 To LastStar - 1
CheckSum = CheckSum Xor Asc(strValues(CheckLoop)(CheckString))
Next '
If CheckSum <> TransCheckSum Then
'error with the checksum
...
好的,我得到了For
循环。我只需要解释Xor正在做什么以及如何将其用于校验和。
感谢。
PS:作为奖励,如果有人能提供c#翻译,我将非常感激。答案 0 :(得分:2)
使用Xor
是一种计算校验和的简单算法。这个想法与计算parity bit时的想法相同,但是在字节上计算了8位。更高级的算法(如CRC和MD5)通常用于计算更苛刻应用的校验和。
C#代码如下所示:
string value = strValues[checkLoop];
int lastStar = value.IndexOf("*");
int transCheckSum = Convert.ToByte(value.Substring(lastStar + 1, 2), 16);
int checkSum = 0;
for (int checkString = 4; checkString < lastStar; checkString++) {
checkSum ^= (int)value[checkString];
}
if (checkSum != transCheckSum) {
// error with the checksum
}
我对代码进行了一些调整,以适应C#的转换,以及一些有意义的事情。我声明了使用的变量,并使用驼峰案例而不是Pascal案例用于局部变量。我为字符串使用局部变量,而不是每次都从集合中获取它。
VB Val
方法在找到无法识别的字符时停止解析,因此要使用框架方法我假设校验和的长度是两个字符,以便它可以解析字符串"3B"
而不是"3B</HD>"
。
循环从第四个字符开始,跳过第一个"<HD>"
,这在逻辑上不应该是应该为其计算校验和的数据的一部分。
在C#中,您不需要Asc
函数来获取字符代码,您只需将char
转换为int
。
答案 1 :(得分:0)
代码基本上是获取字符值并执行Xor以检查完整性,您可以在奇偶校验部分对此页面中的操作进行非常好的解释:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/xor.html