我需要一些帮助来理解下面的代码,以及我可能哪里出错了。使用 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的地址,pSentence是函数传入的一个数组。这个数组实际上是由一串用户输入组成的,这些用户输入应该被“解析”并使用校验和进行评估。这个 while 循环遍历数组中的每个元素,只要它没有看到 NULL 或 ASTERIX,并对值进行异或运算。所以如果我说 pSentence 的元素 [1] 和元素 [2] 是“A”和“B”(所以 while 循环,循环两次,并且 checkSum 是 Xor 值“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;
}
最佳答案
我认为您的问题是,您对 sprintf()
输出的期望是错误的。要查看问题所在,只需在 strcmp()
调用的条件之前添加此行:
fprintf(stderr, "chkSumToken: \"%s\"\npSentence: \"%s\"\n", chkSumToken, pSentence);
我认为,您期望的输出例如是“03”,但是 sprintf()
默认情况下用空格填充字段,而是传递“3”。要获得前导零,请使用 "%02x"
作为格式字符串。
关于c - 解析数组,查找值并使用校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19739153/