C / C ++ контрольная цифра - PullRequest
0 голосов
/ 02 марта 2011

Я пишу функцию для построения контрольной суммы из заданной строки.

Контрольная сумма определяется как: 2-е дополнение 7 младших разрядов двоичной суммы всех символов в строке, предшествующейконтрольная сумма, включая STX и CR.

Пока что я пришел к выводу:

CheckDigit = getcheckdigit(buffer);
sprintf(buffer,"%c%c%c%s%s%c%c",
        2,
        iDP,
        iStatus,
        my_ltoa(s,NetWeight,7,0x00),
        my_ltoa(t,TareWeight,6,0x00),
        13, 
        CheckDigit);

int getcheckdigit(char *buffer) {

    int checkdigit,i;
    int sum;
    char *ptr;

    for (i=0;i<=16;i++) {
        *ptr=buffer[i];
        sum = sum + atoi(ptr);      
    }

    sum = sum % 64;

    checkdigit = ~sum;
    checkdigit = checkdigit + 1;

    return checkdigit;
}

Это, кажется, возвращает то же значение, и я не могу понять, почему, поскольку я не могуотладить его.

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Ваша сумма не инициализирована.

Вы защищаете неопределенный указатель (ptr).

Вам не нужны atoi.

Вы используете толькомладшие 6 битов.

Дополнение к двум - просто отрицание (хотя ваш двоичный файл не должен и добавление 1 должно работать).

Попробуйте:

int getcheckdigit(char *buffer) {

    int i;
    int sum = 0;

    for (i=0;i<=16;i++) {
        sum += buffer[i];
    }

    sum = -(sum % 128);

    return sum;
}
1 голос
/ 02 марта 2011

Вам не нужен atoi, просто добавьте buffer[i]. atoi интерпретирует строку как число, что-то нежелательное в этом случае, и вы используете ее неправильно, если это требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...