我正在编写一个函数来从给定的字符串构建校验和。
校验和定义为: 校验和之前一行上所有字符的二进制和的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;
}
这似乎返回相同的值,我无法弄清楚为什么我无法调试它。
答案 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;
}