java 中 8 位 Fletcher 算法的正确实现是什么?
what is the correct implementation of the 8-bit Fletcher algorithm in java?
我正在尝试实现 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 不能用 8 位二进制表示,它是 ckA 和 ckB 的长度。
任何人都可以阐明这个问题吗?
任何帮助,将不胜感激。谢谢。
根据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 的或运算,因此 ckA 的值几乎肯定应该小于 256。但是,除非你正在处理潜在的大的二进制字符串,你可能只对 ckA 执行模数计算就可以了。
我正在尝试实现 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 不能用 8 位二进制表示,它是 ckA 和 ckB 的长度。
任何人都可以阐明这个问题吗? 任何帮助,将不胜感激。谢谢。
根据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 的或运算,因此 ckA 的值几乎肯定应该小于 256。但是,除非你正在处理潜在的大的二进制字符串,你可能只对 ckA 执行模数计算就可以了。