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 中的 char
是 unsigned 16 位类型。不错
BigInteger b2 = new BigInteger(b);
规避了这一点。它将数据解释为 2 的补码 signed 16 位类型。
因此有所不同。
我原以为 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 中的 char
是 unsigned 16 位类型。不错
BigInteger b2 = new BigInteger(b);
规避了这一点。它将数据解释为 2 的补码 signed 16 位类型。
因此有所不同。