【问题标题】:what is the correct implementation of the 8-bit Fletcher algorithm in java?java中8位Fletcher算法的正确实现是什么?
【发布时间】:2016-03-09 08:18:20
【问题描述】:

我正在尝试实现 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 不能用 ckA 和 ckB 的长度的 8 位二进制表示。

谁能解释一下这个问题? 任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 如何在网上搜索测试值和相应的正确结果?至少对于这些测试输入,您可以确定您的实现是否正确

标签: java algorithm checksum 8-bit


【解决方案1】:

根据this article,您应该对 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 的 OR 运算,因此 ckA 的值几乎肯定应该小于 256。但是,除非您正在处理可能很大的二进制文件字符串,您可能只在 ckA 上执行模数计算。

【讨论】:

  • 谢谢你,尼尔。我会试试的。我实际上正在处理更大的二进制字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多