我正在将 bigint 转换为二进制、radix16 和 radix64 编码并看到神秘的 msb 零填充。这是一个大整数问题,我可以通过剥离零填充或做其他事情来解决吗?

我的测试代码:

    String s;
    System.out.printf( "%s length %d\n", s = "123456789A", (new BigInteger( s, 16 )).toByteArray().length );
    System.out.printf( "%s length %d\n", s = "F23456789A", (new BigInteger( s, 16 )).toByteArray().length );

产生输出:
    123456789A length 5
    F23456789A length 6

其中较长的数组在前面有零填充。检查 BigInteger.toByteArray() 我看到:
public byte[] toByteArray() {
    int byteLen = bitLength()/8 + 1;
    byte[] byteArray = new byte[byteLen];

现在,我可以找到 private int bitLength; ,但我无法完全找到 bitLength() 的定义位置来弄清楚为什么这个类这样做 - 也许连接到符号扩展?

最佳答案

感谢乔恩斯基特的回答。这是我用来转换的一些代码,很可能可以对其进行优化。

import java.math.BigInteger;
import java.util.Arrays;

public class UnsignedBigInteger {

    public static byte[] toUnsignedByteArray(BigInteger value) {
        byte[] signedValue = value.toByteArray();
        if(signedValue[0] != 0x00) {
            throw new IllegalArgumentException("value must be a psoitive BigInteger");
        }
        return Arrays.copyOfRange(signedValue, 1, signedValue.length);
    }

    public static BigInteger fromUnsignedByteArray(byte[] value) {
        byte[] signedValue = new byte[value.length + 1];
        System.arraycopy(value,  0, signedValue, 1, value.length);
        return new BigInteger(signedValue);
    }
}

10-04 14:36