要使这个值的二进制补码,你将不得不操纵的内容。这当然是不可能的,所以你第一次得到的内容出来,操纵它们,然后让他们到一个新的BigInteger
:
public static BigInteger twosComplement(BigInteger original)
{
// for negative BigInteger, top byte is negative
byte[] contents = original.toByteArray();
// prepend byte of opposite sign
byte[] result = new byte[contents.length + 1];
System.arraycopy(contents, 0, result, 1, contents.length);
result[0] = (contents[0] < 0) ? 0 : (byte)-1;
// this will be two's complement
return new BigInteger(result);
}
public static void main(String[] args)
{
BigInteger a = new BigInteger("-173B8EC504479C3E95DEB0460411962F9EF2ECE0D3AACD749BE39E1006FC87B8", 16);
BigInteger b = twosComplement(a);
System.out.println(a.toString(16).toUpperCase());
System.out.println(b.toString(16).toUpperCase());
// for comparison, from question:
System.out.println("E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641D61EFF9037848");
}
输出:
-173B8EC504479C3E95DEB0460411962F9EF2ECE0D3AACD749BE39E1006FC87B8
E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641C61EFF9037848
E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641D61EFF9037848
而这个新BigInteger
是真正的补,而不仅仅是对比特的重新解释。
对不起,我没有答案,但你究竟使用这个? – Michael
我们在Android和iOS上遵循协议。在iOS中,BIGNUM产生+ ve数字,但在Android中,BigInteger显示-ve数(2的补码)。我们需要匹配两个值来进行计算。 – Harish
为什么你使用BigInteger呢?我认为这更多是协议解析器的问题。我建议你编辑你的问题,并添加关于你收到什么数据的信息和代码,以及你如何解析它,以及你以后做了什么。 – Robert