为了账号安全,请及时绑定邮箱和手机立即绑定

将 Big Integer 值转换为 Java 中 8 的倍数的八位字节(2s 补码大端)序列

将 Big Integer 值转换为 Java 中 8 的倍数的八位字节(2s 补码大端)序列

狐的传说 2021-12-01 16:12:10
Java中如何将大整数转换为以下字节数组形式:大整数被编码为八位字节序列,采用二进制补码表示法,以大端字节序传输。如果序列的长度不是八字节的倍数,那么大整数应该用最少数量的前导符号扩展字节填充,使长度成为八字节的倍数。这与KMIP 协议的第 9.1.1.4 节项目值有关
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

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


对于 a 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));after 操作不应失败。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信