我有16个字节的数组数据,需要将其转换为OpenSSL BN_bin2bn
提供的类似输出。每OpenSSL documents:
BN_bin2bn()将长度为len的big-endian形式的正整数转换为BIGNUM,并将其置于ret中。如果ret为NULL,则创建一个新的BIGNUM。
我很难这样做。 BN_bin2bn
使用unsigned long来表示值,但在Java中,unsigned不支持。我尝试了下面提到的代码来实现相同的但是在这里只有前4个字节的数据与bin2bn匹配。其余数据不同。唯一可能的原因是在C中,unsigned long可以存储16个字节的数据,但在Java中只能存储8个字节。
当我尝试转换为无符号时,对于5-8个字节,它会越过8字节限制并为long变量赋予负值。
我也尝试使用BigInteger
。结果是一样的。前4个字节匹配,但结果不匹配。非常感谢任何帮助..这是代码:
byte[] arrayValue = hexToByteArray("53ABA93B9131C439D2942C7CBC483FA5");
long op1 = 0L;
int n = 16 , m = 7;
int x = 0;
while (n-- > 0) {
op1 = (op1 << 8L) | (0xFF & arrayValue[x++]);
System.out.println(op1);
if (m-- == 0) {
op1 = 0L;
}
}
输出结果为:
83
21419
5483433
1403758907
359362280337
91996743766321
23551166404178372
6029098599469663289
210
53908
13800492
3532926076
904429075644
231533843364936
59272663901423679
-3272942114945089627
使用Big Integer:
BigInteger op = BigInteger.ZERO;
while (n-- > 0) {
int temp1 = 0xFF & arrayValue[k++];
op = op.shiftLeft(8).or(new BigInteger(String.valueOf(temp1)));
System.out.println(op);
}
输出结果为:
83
21419
5483433
1403758907
359362280337
91996743766321
23551166404178372
6029098599469663289
210
53908
13800492
3532926076
904429075644
231533843364936
bin2bn方法的输出:
83
21419
5483433
1403758907
2879994769
2839253297
999371204
2435957817
210
53908
13800492
3532926076
2485943484
746372168
2092714047
3158851493