BigInteger到byte []

Kam*_*ami 15 java byte biginteger

我需要将Java BigInteger实例转换为以字节为单位的值.从API中,我得到了这个方法toByteArray(),它返回一个包含这个BigInteger的二进制补码表示的byte [].

因为我的所有数字都是正128位(16字节)整数,所以我不需要2位补码形式给我128位+符号位(129位)......

有没有办法直接从BigInteger获得标准(没有2的补码形式)表示?

如果没有,我怎么能正确移位整个byte [17]数组以丢失符号位以获得一个byte [16]数组?

Tho*_*mas 27

你根本不需要转移.符号位是字节数组中最重要的(=最左边)位.由于您知道您的数字将始终为正数,因此保证为0.但是,整个数组是右对齐的.

所以有两种情况:你最左边的字节是0x00.如果它是0x00你可以安全地丢弃它:

byte[] array = bigInteger.toByteArray();
if (array[0] == 0) {
    byte[] tmp = new byte[array.length - 1];
    System.arraycopy(array, 1, tmp, 0, tmp.length);
    array = tmp;
}
Run Code Online (Sandbox Code Playgroud)

如果它不是0,那么你不能删除它 - 但你的数组已经在你想要的表示中,所以你不必做任何事情.

上述代码应适用于这两种情况.

  • SO 用户 *roman-nikitchenko* 指出 `if` 的整个主体可以简化为一行:`array = Arrays.copyOfRange(array, 1, array.length);`。有了这种变化,就不需要声明一个 `tmp` 数组。这是一个很好的提示,谢谢!:-) (3认同)