vb xor checksum

时间:2013-03-03 12:06:13

标签: vb.net checksum xor

这个问题可能已经被问到了,但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#翻译,我将非常感激。

2 个答案:

答案 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