2011-03-02 96 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正在將一個字符串解釋爲一個數字,在這種情況下不需要這樣做,並且如果需要的話,可以用錯誤的方式使用它。