C 通过数组进行解析,查找值并使用校验和
我需要一些帮助来理解下面的代码,以及我可能出错的地方。使用MPLAB 这是函数的开始,我得到了这部分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
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);