C 通过数组进行解析,查找值并使用校验和

C 通过数组进行解析,查找值并使用校验和,c,arrays,pointers,checksum,xor,C,Arrays,Pointers,Checksum,Xor,我需要一些帮助来理解下面的代码,以及我可能出错的地方。使用MPLAB 这是函数的开始,我得到了这部分 char validateNemaSentence(char *pSentence) { char chkSumToken[3]; unsigned char calculatedChecksum = 0; char errorCode = NOERROR; if(*pSentence != '$') return ERROR; pSen

我需要一些帮助来理解下面的代码,以及我可能出错的地方。使用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++;
}
函数的这部分递增pEntence的地址,该地址由函数作为数组引入。这个数组实际上是由一组用户输入组成的,这些输入应该用校验和进行分析和计算。这个while循环遍历数组中的每个元素,只要它没有看到NULL或ASTERIX,并对值进行异或。如果我说pSentence的元素[1]和元素[2]是A和B,那么while循环,循环两次,校验和是Xor值A,那么我是否将它们的ascii值异或在一起,得到校验和的值?这就是函数的工作原理吗

所以ascii是0x41 ascii是0x42

calculatedChecksum ^= *pSentence (which is A) 
=0100 0001

然后

calculatedChecksum ^= *Sentence (which is B)
0100 0001 calcChecksum的当前值

0100 0010 ASCII/B

=0000 0011

对吗

最后一个函数就是我的主要问题所在。我的代码总是返回错误,并且我不确定如何正确地为函数分配校验和,因为如果我将下面的strcmp更改为==0,那么我实际上可以发送一个pSentence并对其求值,但是我的校验和将无法正常工作

if(*pSentence == '*')
    {
    sprintf(chkSumToken, "%2x", calculatedChecksum);
    pSentence++;    
    if(strcmp(pSentence,chkSumToken) !=0) errorCode = ERROR;
    }

我认为你的问题是,你对sprintf输出的期望是错误的。要查看有什么问题,只需在strcmp调用的条件之前添加这一行:

我认为,您期望的输出是例如03,但是sprintf默认使用空格填充字段,而不是3。要获取前导零,请使用%02x作为格式字符串

fprintf(stderr, "chkSumToken: \"%s\"\npSentence: \"%s\"\n", chkSumToken, pSentence);