2013-11-02 3 views
1

Мне нужна помощь в понимании следующего бита кода и где я могу ошибиться. Использование 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, а Xors - значение. Поэтому, если бы я сказал, что элемент [1] и элемент [2] pSentence были произнесены «A» и «B» (поэтому цикл while, петли дважды, а checkSum - это Xor значение «A»), тогда do i Xor их значения ascii, чтобы получить значение для контрольной суммы? Так работает эта часть функции?

Так ASCII является 0x41 В ASCII является 0x42

calculatedChecksum ^= *pSentence (which is A) 

= 0100 0001

, а затем

calculatedChecksum ^= *Sentence (which is B) 

0100 0001 (Текущее значение calcChecksum)

0100 0010 (ASCII of B)

= 0000 0011

Это правильно?

Теперь эта последняя функция - вот где большая часть моей проблемы. Мой код всегда возвращает ERROR, и я не уверен, как правильно назначить контрольную сумму для функций, потому что если я изменил strcmp ниже на «== 0», тогда я могу фактически отправить pSentence и оценить его, но тогда моя контрольная сумма не будет работать должным образом

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

ответ

0

Я думаю, ваша проблема в том, что ваши ожидания о выходе из sprintf() неправильно. Для того, чтобы посмотреть, что случилось, просто добавьте эту строку перед условием с strcmp() вызова:

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

Я думаю, вывод, что вы ожидаете, например, «03», но sprintf() подушечки поля с пробелами по умолчанию, доставляющих " 3 "вместо этого. Чтобы получить начальный ноль, используйте "%02x" в качестве строки формата.

Смежные вопросы