将大整数值转换为 8 位字节(2s 补充大字节序)序列,该序列在 Java 中是 8 的倍数



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

大整数被编码为八位字节序列,以二进制的补码表示法传输大端。如果序列的长度不是 8 个字节的倍数,则应使用最少数量的前导符号扩展字节填充大整数,以使长度成为 8 个字节的倍数。

这是根据 KMIP 协议第 9.1.1.4 节项目值

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

对于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()获取字节数组
  • 计算数组长度的下一个 8 倍数
  • 如果此数字与长度不同,则需要填充
    • 分配所需大小的数组
    • 负数时用-1(符号扩展名(填充填充(在另一种情况下它已经具有所需的零(
    • 复制原始字节

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

相关内容

  • 没有找到相关文章

最新更新