Java BigInteger mod 给出了意想不到的结果
Java BigInteger mod gives unexpected result
我正在尝试使用 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
当我 mod 前两个值(23104 和 50)时,我得到 4。我在我的计算器上仔细检查了一下,结果是一样的(使用十进制)。但是,如果您采用二进制值(110010 和 101101001000000)和 mod,您应该得到 1000(二进制),但是 0b1000 != 4.
我在 YouTube 上观看了 this video,我使用了相同的值,但我得到了不同的结果。
我是否错误地使用了 BigInteger?
CRC 的计算是将二进制 多项式 除以另一个二进制 多项式 的余数(模)。它与整数除法无关。
我正在尝试使用 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
当我 mod 前两个值(23104 和 50)时,我得到 4。我在我的计算器上仔细检查了一下,结果是一样的(使用十进制)。但是,如果您采用二进制值(110010 和 101101001000000)和 mod,您应该得到 1000(二进制),但是 0b1000 != 4.
我在 YouTube 上观看了 this video,我使用了相同的值,但我得到了不同的结果。
我是否错误地使用了 BigInteger?
CRC 的计算是将二进制 多项式 除以另一个二进制 多项式 的余数(模)。它与整数除法无关。