【问题标题】:Parsing through an array, looking for values and using a checksum解析数组,查找值并使用校验和
【发布时间】:2013-11-02 05:08:06
【问题描述】:

我需要一些帮助来理解下面的代码,以及我可能出错的地方。使用 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 值异或在一起以获得校验和的值?那部分功能是这样工作的吗?

所以一个 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;
    }

【问题讨论】:

    标签: c arrays pointers checksum xor


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多