Какова правильная реализация 8-битного алгоритма Флетчера в java?

Я пытаюсь реализовать 8-битный алгоритм fletcher. Я написал фрагмент кода, который это делает, но я не уверен, правильно ли понял алгоритм. это мой кусок кода:

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 не может быть представлена ​​8-битным двоичным кодом, который является длиной ckA и ckB.

может ли кто-нибудь пролить свет на эту проблему? любая помощь будет оценена по достоинству. спасибо.

3
задан user4559332 09 марта '16 в 11:18
источник поделиться
1 ответ

В соответствии с этой статьей вы должны выполнить расчет модуля для значений 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 ORed с ckA, поэтому значение ckA должно быть почти наверняка меньше 256. Однако, если вы не имеете дело с потенциально большими двоичными строки, вы, вероятно, могли бы уйти с вычислением модуля только на ckA.

2
ответ дан Neil 09 марта '16 в 11:29
источник поделиться

Другие вопросы по меткам