我期待BigInteger类中的两个构造函数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
答案 0 :(得分:2)
看起来byte[]
构造函数将输入视为常规2的补码数据,而十六进制构造函数将其视为十六进制字符串。
使用new BigInteger(int signum, byte[] magnitude)
可以强制该值为正数,因此new BigInteger(1, b)
将为38068
。
答案 1 :(得分:1)
毫不奇怪38068 + 27468是65536。
请记住,java.lang.String
是一个字符数组,Java中的char
是无符号 16位类型。好的。
BigInteger b2 = new BigInteger(b);
规避了这一点。它将数据解释为2的补码签名 16位类型。
因此存在差异。