Vb.net vb异或校验和

Vb.net vb异或校验和,vb.net,checksum,xor,Vb.net,Checksum,Xor,这个问题可能已经被问到了,但是没有任何答案,所以实际上给了我我需要的答案 我正在尝试对其他人的vb.NET代码进行反向工程,而我被Xor在这里所做的事情所困扰。下面是解析的soap请求主体的1行(一些值已被隐藏,因此在这种情况下校验和可能不起作用): CHANGEDTHIS01,W-A,07753.2018E,1122.6674N,0.00,1,CID_V_01*3B 这是检查它的vb代码片段 LastStar = strValues(CheckLoop).IndexOf("*") StrLe

这个问题可能已经被问到了,但是没有任何答案,所以实际上给了我我需要的答案

我正在尝试对其他人的vb.NET代码进行反向工程,而我被
Xor
在这里所做的事情所困扰。下面是解析的soap请求主体的1行(一些值已被隐藏,因此在这种情况下校验和可能不起作用):

CHANGEDTHIS01,W-A,07753.2018E,1122.6674N,0.00,1,CID_V_01*3B
这是检查它的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
    ...
LastStar=strValues(CheckLoop).IndexOf(“*”)
StrLen=strValues(CheckLoop).Length
TransCheckSum=Val(“&h”+strValues(CheckLoop)。子字符串(LastStar+1,(StrLen-(LastStar+1)))
校验和=0
对于CheckString=0到LastStar-1
校验和=校验和异或Asc(标准值(校验循环)(校验字符串))
下一个
如果校验和转换校验,则
'校验和错误
...
好的,我把它放到
For
循环中。我只需要解释一下Xor在做什么,以及它是如何用于校验和的

谢谢


PS:作为奖励,如果有人能提供c#翻译,我将不胜感激。

代码基本上是获取字符值并执行Xor以检查完整性,您在本页中对操作有一个非常好的解释,在奇偶校验部分:

使用异或是计算校验和的简单算法。其思想与计算a时相同,但在字节间计算了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
}
string value=strValues[checkLoop];
int lastStar=value.IndexOf(“*”);
int transCheckSum=Convert.ToByte(value.Substring(lastStar+1,2),16);
整数校验和=0;
对于(int checkString=4;checkString
我对代码做了一些调整,以适应到C#的转换,以及一些有意义的事情。我声明了使用的变量,并对局部变量使用camel case而不是Pascal case。我对字符串使用局部变量,而不是每次从集合中获取它

VB
Val
方法在发现无法识别的字符时停止解析,因此为了使用框架方法,我假设校验和的长度是两个字符,这样它就可以解析字符串
“3B”
,而不是
“3B”

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


在C#中,不需要使用
Asc
函数来获取字符代码,只需将
char
强制转换为
int

显然,校验和是通过将所有字符异或在一起来计算的。我不确定还有更多的话要说…@OliCharlesworth那么它就这么简单,Xor是一种提供字符串完整性指示符的方法吗?我想我没有看到这一点的好处——我在证明/确认什么逻辑?校验和实际上是任何将任意长度的字符串缩减为小的固定长度字符串的函数。某些校验和函数比其他函数具有更好的属性。简单的XOR校验和非常粗糙(例如,它不标识交换的字节),但它非常容易计算。如果数据中的任何一个字节被破坏,它肯定会告诉你(当然,它不会告诉你是哪个字节)。这是一个NMEA语句,校验和是*后面的字符吗?
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
}