要使這個值的二進制補碼,你將不得不操縱的內容。這當然是不可能的,所以你第一次得到的內容出來,操縱它們,然後讓他們到一個新的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