【问题标题】:Java BigInteger mod gives unexpected resultJava BigInteger mod 给出了意想不到的结果
【发布时间】:2017-04-14 04:07:55
【问题描述】:

我正在尝试使用 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 上观看了 this video,我使用了相同的值,但得到了不同的结果。

我是否错误地使用了 BigInteger?

【问题讨论】:

  • 为什么?你知道java.util.zip.CRC32吗?
  • 我没有看到问题。我看到 R = D2.mod(G); R == 0b100,这是 4。这对我来说很好。
  • @EJP - 这是一个类。我们必须实施我们自己的 CRC 计划。

标签: java biginteger crc


【解决方案1】:

CRC 的计算是得到一个二进制多项式除以另一个二进制多项式的余数(模)。它与整数除法无关。

【讨论】:

  • 哇,我应该意识到这一点。谢谢!我需要弄清楚如何进行二进制多项式除法!关于从哪里开始的任何提示?使用字节数组?
猜你喜欢
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
  • 2017-11-05
相关资源
最近更新 更多