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

时间:2017-02-02 11:22:56

标签: java arrays byte biginteger

我期待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

2 个答案:

答案 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位类型。

因此存在差异。