BigInteger 乘法中的前导零
Leading zero in BigInteger multiplication
我使用简单的函数来乘大整数。有时输出会包含一个前导零字节。为什么会发生,我该如何预防?
PS:a和b已经小于mod
private byte[] multiply(final byte[] a, final byte[] b, final BigInteger mod) {
BigInteger M1 = new BigInteger(1, a);
BigInteger M2 = new BigInteger(1, b);
BigInteger out = M1.multiply(M2).mod(mod);
res = out.toByteArray();
}
如果(正)值的第一个字节是 128 到 255,则添加额外的零字节。
需要这个字节,以便生成的字节至少有一个符号位 (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray%28%29)
BigInteger.valueOf(5L).toByteArray()
returns 只有一个字节 (5) 的字节数组。
BigInteger.valueOf(128L).toByteArray()
returns 只有两个字节的字节数组(无符号表示形式为 0 和 128)。这是为了区分
的结果
BigInteger.valueOf(-128L).toByteArray()
其中returns也是一个有两个字节的字节数组(255, 128 无符号表示)
我使用简单的函数来乘大整数。有时输出会包含一个前导零字节。为什么会发生,我该如何预防?
PS:a和b已经小于mod
private byte[] multiply(final byte[] a, final byte[] b, final BigInteger mod) {
BigInteger M1 = new BigInteger(1, a);
BigInteger M2 = new BigInteger(1, b);
BigInteger out = M1.multiply(M2).mod(mod);
res = out.toByteArray();
}
如果(正)值的第一个字节是 128 到 255,则添加额外的零字节。
需要这个字节,以便生成的字节至少有一个符号位 (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray%28%29)
BigInteger.valueOf(5L).toByteArray()
returns 只有一个字节 (5) 的字节数组。
BigInteger.valueOf(128L).toByteArray()
returns 只有两个字节的字节数组(无符号表示形式为 0 和 128)。这是为了区分
的结果BigInteger.valueOf(-128L).toByteArray()
其中returns也是一个有两个字节的字节数组(255, 128 无符号表示)