我有一个电子板,我正在打印数据。要计算输出的校验和字节,请使用以下算法:
word CountCS(byte *Buff, byte Cnt) //Cnt - count of bytes
{
dword cs1, cs2, m;
byte k;
k=0;
cs1=0;
cs2=0;
while (Cnt) {
m=*Buff;
cs1 +=m;
m ^=0x5A;
if (k) m=(m >> k) | (m << (8-k));
k=(k+1) & 0x07;
cs2 +=m;
Buff++;
Cnt--;
};
return (cs2<<8) | (cs1 & 0xFF);
}
记分板制造商提供C代码,我需要将其转换为java。我试着转换,但结果是错误的,这里是java代码
public int checksum(int [] buffer, int count) {
int cs1 =0, cs2 = 0, m;
int k = 0, i = 0;
while (count != 0) {
m = buffer[i];
cs1 += m;
m ^= 0x5a;
if (k != 0) m = (m >> k) | (m << (8-k));
k = (k +1) & 0x07;
cs2 += m;
i++;
count--;
}
return (cs2 << 8) | (cs1 & 0xff);
}
谁能看到我做错了什么? 对不起,但我是java的新手。
非常感谢,问题解决了
答案 0 :(得分:3)
if (k) m=(m >> k) | (m << (8-k));
应该是
if (k != 0) m = (m >> k) | (m << (8-k));
不
if (k == 0) m = (m >> k) | (m << (8-k));
答案 1 :(得分:1)
您的变量大小不同:k(byte vs int)。在java int中是32位签名。 C ++中的字节可能依赖于平台,更可能是8位或16位无符号。所以当你添加和乘法/移位等时它会有不同的值。