-1

データを印刷している電子ボードがあります。出力のチェックサム バイトを計算するには、次のアルゴリズムを使用します。

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が初めてです。

どうもありがとう、問題は解決しました

4

2 に答える 2

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));
于 2013-09-24T07:17:42.730 に答える
1

変数のサイズが異なります: k (byte vs int)。Java では int は 32 ビット符号付きです。C++ のバイトは、プラットフォームに依存する可能性があり、8 ビットまたは 16 ビットの符号なしである可能性が高くなります。そのため、加算や乗算/シフトなどを行うと、異なる値になります。

于 2013-09-24T07:24:54.963 に答える