【问题标题】:Java program to calculate 8-bit checksum计算 8 位校验和的 Java 程序
【发布时间】:2021-04-01 13:59:16
【问题描述】:

我有一个任务来计算一些 8 位二进制数的校验和。 我已经走了很长一段路,但由于某种原因,它给了我错误的结果。例如,如果 x 是:10101010 并且 y 是:01101111,则校验和将为 11100110。但我的代码给出了校验和 01101110(反转全部)。 请注意求和的取反发生在一个不同的、已经建立的方法中。这意味着我的方法返回 10010001,但应该返回 00011001。

我哪里出错了?

Octet 方法已经生成。

    int[] x = new int[8];

    Octet(String s){
        if (s.length() != 8) {
            System.out.println("Too few or too many characters");
            return;
        }
        for (int i = 0; i < 8; i++) {
            if (s.charAt(i) == '1') {
                x[7 - i] = 1;
            }
            else {
                x[7 - i] = 0;
            }
        }
    }
    
    Octet sum(Octet y) {
        Octet result = new Octet("00000000");
         
        int carry = 0;

        for(int i = 0; i < 8; i++) {
            result.x[i] = x[i] ^ y.x[i] + carry;
            carry = x[i] & y.x[i];
        }

        if(carry == 1) {
            for(int i = 0; i < 8 && carry == 0; i++) {
                result.x[i] = result.x[i] ^ carry;
                carry = result.x[i] & carry;
            }
        }
                        
        return result;
    } 

【问题讨论】:

  • 第二个for 循环永远不会循环,因为如果carry == 1,循环的条件是false。什么是Octet?为什么你将y 传递给你的函数,却将x 作为外部变量访问?
  • @CryptoFool 使用八位字节方法更新。它基本上是 8 位长,只包含 1 和 0。
  • 这些八位字节的现有代码:x = Octet{[0, 1, 0, 1, 0, 1, 0, 1]}; y = Octet{[1, 1, 1, 1, 0, 1, 1, 0]}; 返回Octet{[1, 0, 2, 0, 1, 0, 2, 1]},因此您应该更新代码并澄清校验和计算。 `
  • 我猜这一切都属于 class Octet { } 块。

标签: java calculator checksum 8-bit


【解决方案1】:

您的问题主要是您错误地将二进制 (XOR) 和整数 (+) 操作混合在相同的整数值上。由于您将三个值组合在一起,因此您应该坚持加法。

如果所有这些都可以重写,我会将这些位存储在一个整数中,在这种情况下,您几乎可以免费获得逻辑。但是,如果这是一个您无法更改八位字节定义的练习,那么这里有一个 sum 函数,它可以根据处理整数来做正确的事情:

Octet sum(Octet y) {
    Octet result = new Octet("00000000");
    int carry = 0;
    for(int i = 0; i < 8; i++) {
        int a = x[i] + y.x[i] + carry;
        result.x[i] = a & 1;
        carry = a >> 1;
    }
    return result;
}

这里的要点是您不想使用 XOR。只有整数运算才能让您将三个值组合在一起并在所有情况下获得正确的结果。所以你把这三个值相加,然后提取得到的两个位(结果位 + 进位位)。

我不知道你的第二个循环应该在你的 sum 函数中做什么,但正如所写的那样,它永远不会进入循环,因此无论如何也不会做任何事情。

我在Octet 类中添加了一个toString 方法:

public String toString() {
    StringBuilder r = new StringBuilder();
    for (int i = 0 ; i < 8 ; i++) {
        r.append(x[7-i] == 1? "1" : "0");
    }
    return r.toString();
}

这样测试代码才能给出正确、可读的结果:

public static void main(String[] args) {
    Octet x = new Octet("10101010");
    Octet y = new Octet("01101111");
    Octet z = x.sum(y);
    System.out.println(z);
}

结果:

00011001

【讨论】:

  • 非常感谢!!您的代码很容易理解!不知道混合二进制和整数运算时会导致问题,但现在我知道了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多