将Big Integer值转换为8位字节(2s补充big endian)序列,这是Java中8的倍数

时间:2018-10-22 09:34:57

标签: java java-8 biginteger data-conversion kmip

如何在Java中将big integer转换为以下字节数组形式:

Big Integer编码为八位字节序列,以二进制补码表示,传输big-endian。如果序列的长度不是8个字节的倍数,则应使用最小数量的前导符号扩展字节来填充Big Integers,以使长度为8个字节的倍数。

这应符合KMIP protocol第9.1.1.4节“项目值”

1 个答案:

答案 0 :(得分:6)

据我所知,BigInteger API没有提供填充功能,因此您必须自己进行填充:

对于BigInteger bigInt,使用

byte[] array = bigInt.toByteArray();
int len = array.length, len8 = len+7 & ~7;
if(len != len8) {
    int pad = len8 - len;
    byte[] nArray = new byte[len8];
    if(bigInt.signum() < 0) Arrays.fill(nArray, 0, pad, (byte)-1);
    System.arraycopy(array, 0, nArray, pad, len);
    array = nArray;
}
  • 首先,使用toByteArray()获取字节数组
  • 计算数组长度的下一个八分之一
  • 如果此数字与长度不相同,则需要填充
    • 分配所需大小的数组
    • 为负数时填充-1(符号扩展名)(在其他情况下,其已经具有所需的零)
    • 复制原始字节

请注意,符号扩展的填充数组仍与BigInteger(byte[])构造函数兼容,因此操作后的assert bigInt.equals(new BigInteger(array));应该永远不会失败。