gpt4 book ai didi

java - BigInteger.toByteArray() 返回有目的的前导零?

转载 作者:搜寻专家 更新时间:2023-10-31 19:28:06 27 4
gpt4 key购买 nike

我正在将 bigints 转换为二进制、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() 的定义位置来弄清楚为什么这个类这样做 - 也许与符号扩展有关?

最佳答案

是的,这是 documented behaviour :

The byte array will be in big-endian byte-order: the most significant byte is in the zeroth element. The array will contain the minimum number of bytes required to represent this BigInteger, including at least one sign bit, which is (ceil((this.bitLength() + 1)/8)).

bitLength() is documented作为:

Returns the number of bits in the minimal two's-complement representation of this BigInteger, excluding a sign bit.

换句话说,具有相同量级的两个值将始终具有相同的位长度,无论符号如何。将 BigInteger 视为一个无符号整数和一个符号位 - 而 toByteArray() 返回两个部分的所有数据,即“所需的位数无符号整数,符号一位。

关于java - BigInteger.toByteArray() 返回有目的的前导零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com