我需要一些帮助来理解下面的代码,以及我可能出错的地方。使用 MPLAB
这是功能的开始,我得到了这部分
char validateNemaSentence(char *pSentence)
{
char chkSumToken[3];
unsigned char calculatedChecksum = 0;
char errorCode = NOERROR;
if(*pSentence != '$')
return ERROR;
pSentence++;
下一部分是我遇到麻烦的地方
while (*pSentence != '\0' && *pSentence != '*')
{
calculatedChecksum ^= *pSentence;
pSentence++;
}
这部分函数增加了 pSentence 的地址,该地址是由函数作为数组引入的。这个数组实际上是由一串用户输入组成的,这些用户输入应该被“解析”并使用校验和进行评估。这个 while 循环遍历数组中的每个元素,只要它没有看到 NULL 或 ASTERIX,并对值进行异或运算。因此,如果我说 pSentence 的元素 [1] 和元素 [2] 分别是“A”和“B”(所以 while 循环,循环两次,并且 checkSum 是 X 或值“A”),然后执行我将它们的 ascii 值异或在一起以获得校验和的值?那部分功能是这样工作的吗?
所以 A ascii 是 0x41 B ascii 是 0x42
calculatedChecksum ^= *pSentence (which is A)
= 0100 0001
进而
calculatedChecksum ^= *Sentence (which is B)
0100 0001 (calcChecksum 的当前值)
0100 0010(B 的 ASCII)
= 0000 0011
那是对的吗?
现在这最后一个功能是我的大部分问题所在。我的代码总是返回错误,我不确定如何为函数正确分配校验和,因为如果我将下面的 strcmp 更改为“== 0”,那么我实际上可以发送一个 pSentence 并对其进行评估,但是我的校验和将无法正常工作
if(*pSentence == '*')
{
sprintf(chkSumToken, "%2x", calculatedChecksum);
pSentence++;
if(strcmp(pSentence,chkSumToken) !=0) errorCode = ERROR;
}