c - 解析数组,查找值并使用校验和

标签 c arrays pointers checksum xor

我需要一些帮助来理解下面的代码,以及我可能哪里出错了。使用 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/

相关文章:

c - 嗨,有人可以告诉我以下代码的作用吗

arrays - 在scala中更新数组的一部分

javascript - 更新对象内的 javascript 数组会更新对象中的所有数组

c++ - 为什么用点运算符的值在C++中没有更改?

c++ - 为什么这个代码片段有效?如何取消引用 nullptr?

c - 动态声明数组sizeof

c - C 中 sizeof 运算符按位 & 失败

c - 从 fgets() 的返回值赋值

c - 比较字符串中的字母

python - 在数组中操作 Numpy 数组的快速方法