2011-03-02 61 views
0

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

校验和定义如下: 校验和前面一行上包括STX和CR在内的所有字符的二进制和的7个低位的2的补码。

到目前为止,我想出了:

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; 
} 

这似乎返回相同的值,我想不通为什么我不能调试。

+1

你为什么不能调试呢? – CharlesB 2011-03-02 10:40:06

+1

请阅读本书,解释如何使用指针。你做得很错误。 – ThiefMaster 2011-03-02 10:40:34

+0

当你说“所有字符的二进制和”时,你的意思是ASCII值的总和?那么你不需要atoi。什么是STX? – Rup 2011-03-02 10:43:13

回答

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; 
} 
+0

谢谢,多年来没有编写c语言,我无法调试,因为我在嵌入式环境中工作,没有用于调试的工具。 – charlo 2011-03-02 11:25:26

1

你不需要atoi,只需添加buffer[i]。 atoi正在将一个字符串解释为一个数字,在这种情况下不需要这样做,并且如果需要的话,可以用错误的方式使用它。