将 Big Integer 值转换为八位字节(2s 补充大端)序列,它是 Java 中 8 的倍数
Convert Big Integer value to eight bit bytes(2s complement big endian) sequence which is multiple of 8 in Java
如何在Java中将big integer转换为以下字节数组形式:
大整数被编码为八位字节序列,采用二进制补码表示法,以大端方式传输。如果序列的长度不是八字节的倍数,则大整数应使用最少数量的前导符号扩展字节进行填充,以使长度成为八字节的倍数。
这与 KMIP protocol,第 9.1.1.4 节项目价值
据我所知,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));
永远不会失败。
如何在Java中将big integer转换为以下字节数组形式:
大整数被编码为八位字节序列,采用二进制补码表示法,以大端方式传输。如果序列的长度不是八字节的倍数,则大整数应使用最少数量的前导符号扩展字节进行填充,以使长度成为八字节的倍数。
这与 KMIP protocol,第 9.1.1.4 节项目价值
据我所知,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));
永远不会失败。