3

8 ビットのフレッチャー アルゴリズムを実装しようとしています。それを行うコードを書きましたが、アルゴリズムを正しく理解しているかどうかはわかりません。これは私のコードです:

public class TestFletcher {
public static void main(String[] argv) {

    String bin = "10010010101111101110101101110011";
    char[] cA = bin.toCharArray();
    int ckA = 0, ckB = 0;
    for (int i = 0; i < cA.length; i++){
        ckA += Integer.valueOf(cA[i])/49;
        ckB += ckA;
    }
    System.out.println(ckA);
    System.out.println(ckB);

}

私が得ている結果は次のとおりです。ckA = 20、ckB = 308。308 は ckA と ckB の長さである 8 ビット バイナリで表すことができないため、これは正しい実装ではないと思います。

誰でもこの問題に光を当てることができますか? 任意の助けをいただければ幸いです。ありがとうございました。

4

1 に答える 1

2

この記事によると、ckA と ckB の値が 255 を超えないように、値に対してモジュラス計算を実行する必要があります。したがって、例は次のようになります。

String bin = "100100101011111011101011";
char[] cA = bin.toCharArray();
int ckA = 0, ckB = 0;
for (int i = 0; i < cA.length; i++){
    ckA = (ckA + Integer.valueOf(cA[i])/49) % 255;
    ckB = (ckB + ckA) % 255;
}
System.out.println(ckA);
System.out.println(ckB);

System.out.println((ckB << 8) | ckA);

これはおそらく、最後のチェックサムが 8 ビット シフトされた ckB と ckA の ORed であるため、ckA の値はほぼ確実に 256 未満になるはずです。おそらく、ckA のみでモジュラス計算を実行することで回避できます。

于 2016-03-09T08:29:09.083 に答える