Java BigInteger mod 给出了意想不到的结果



我正在尝试用Java实现循环冗余检查,我做了一个快速的代码,看看它是否按预期工作。

我必须获取大量数据(128 字节(并使用 CRC 进行检查,因此我认为我应该将二进制值存储在 BigInteger 中以执行计算。 我想过使用字节数组,但我不确定如何在字节数组上执行 mod。

为了测试代码,我使用了小值,但余数值得到了意外的结果。

    // Set G value
    BigInteger bigI = new BigInteger("110010", 2);
    String str = bigI.toString(2);
    System.out.println("G = " + str);
    System.out.println(bigI);
    // Set D value
    BigInteger bigI2 = new BigInteger("1011010010", 2);
    String str2 = bigI2.toString(2);
    System.out.println("D1 = " + str2);
    // Append zeroes to D
    String str3 = str2 + "00000";
    bigI2 = new BigInteger(str3, 2);
    str3 = bigI2.toString(2);
    System.out.println("D2 = " + str3);
    System.out.println(bigI2);
    // Get R value
    BigInteger bigI3 = bigI2.mod(bigI);
    String str4 = bigI3.toString(2);
    System.out.println("R = " + str4);
    // Add R to D
    BigInteger bigI4 = bigI3.add(bigI2);
    String str5 = bigI4.toString(2);
    System.out.println("D3 = " + str5);
    // Get final remainder (nonzero == error)
    BigInteger bigI5 = bigI4.mod(bigI);
    String str6 = bigI5.toString(2);
    System.out.println("Remainder = " + str6);

我的输出是:

G = 110010
50
D1 = 1011010010
D2 = 101101001000000
23104
R = 100
D3 = 101101001000100
Remainder = 1000

当我修改前两个值(23104 和 50(时,我得到 4。 我在计算器上仔细检查了一下,结果是一样的(使用十进制(。 但是,如果您采用二进制值(110010 和 101101001000000(并修改它们,您应该得到 1000(二进制(,但 0b1000 != 4。

我在YouTube上观看了这个视频,我使用相同的值,但我得到了不同的结果。

我是否错误地使用了 BigInteger?

CRC 的计算是得到将一个二元多项除以另一个二元多项式的余数(模(。它与整数除法没有任何关系。

最新更新