1

这个问题可能已经被问过了,但是关于 SO 的任何内容实际上都没有给我我需要的答案。

我正在尝试对其他人的 vb.NET 代码进行逆向工程,但我对 aXor在这里所做的事情感到困惑。这是被解析的soap请求正文的1行(某些值已被遮盖,因此校验和在这种情况下可能不起作用):

<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:作为奖励,如果有人可以提供ac#翻译,我将不胜感激。

4

2 回答 2

2

使用Xor一个简单的算法来计算校验和。这个想法与计算奇偶校验位时的想法相同,但是跨字节计算了八个位。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# 的转换,以及一些有意义的事情。我声明了使用的变量,并对局部变量使用骆驼大小写而不是帕斯卡大小写。我对字符串使用局部变量,而不是每次都从集合中获取它。

VBVal方法在找到无法识别的字符时停止解析,因此使用框架方法我假设校验和的长度是两个字符,以便它可以解析字符串"3B"而不是"3B</HD>".

循环从第四个字符开始,跳过第一个字符,"<HD>"从逻辑上讲,它不应该是计算校验和的数据的一部分。

在 C# 中,您不需要Asc获取字符代码的函数,只需charint.

于 2013-03-03T12:39:01.167 回答
0

该代码基本上是获取字符值并执行 Xor 以检查完整性,您在此页面的奇偶校验部分中有一个很好的操作说明:http ://www.cs.umd.edu/类/sum2003/cmsc311/Notes/BitOp/xor.html

于 2013-03-03T12:23:37.710 回答