BigInteger(String) 和 BigInteger(byte[]) 不相等

BigInteger(String) and BigInteger(byte[]) are not equal

我原以为 BigInteger class、BigInteger(String)BigInteger(byte[]) 中的两个构造函数的行为相似,但事实并非如此。

为什么两个BigInteger不相等?如何从字节数组创建 BigInteger

String hex = "94B4";
byte[] b = DatatypeConverter.parseHexBinary(hex); // -108, -76

BigInteger b1 = new BigInteger(hex, 16); //38068
BigInteger b2 = new BigInteger(b); //-27468

看起来 byte[] 构造函数将输入视为常规 2 的补码数据,而十六进制构造函数将其视为十六进制字符串。

使用 new BigInteger(int signum, byte[] magnitude) 可以强制该值为正,因此 new BigInteger(1, b) 将是 38068

38068 + 27468 等于 65536 也就不足为奇了。

记住 java.lang.String 是字符数组,Java 中的 charunsigned 16 位类型。不错

BigInteger b2 = new BigInteger(b); 规避了这一点。它将数据解释为 2 的补码 signed 16 位类型。

因此有所不同。