C / C ++校验位

时间:2011-03-02 10:36:38

标签: c

我正在编写一个函数来从给定的字符串构建校验和。

校验和定义为:   校验和之前一行上所有字符的二进制和的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 个答案:

答案 0 :(得分:1)

您不需要atoi,只需添加buffer[i]即可。 atoi将字符串解释为数字,在这种情况下不需要的东西,如果需要,你会以错误的方式使用它。

答案 1 :(得分:1)

您的金额未初始化。

您正在引用未定义的指针(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;
}