我需要将BigInteger转换为以big-endian格式编码的无符号整数,但由于BigInteger.toByteArray返回已签名的表示,因此我遇到了问题。如何将此值转换为无符号格式?
(相对)有用的背景
我正在研究一些使用JNI让c ++调用一些Java方法来处理某些加密功能的代码(这是一个将一些功能卸载到Java的Microsoft CNG提供程序)。我有Java中的公钥,我需要转换的BigInteger值是coordinates of the Elliptic Curve Public Key。根据{{3}},我需要提供这些点作为"以大端格式编码的无符号整数"。
修改
事后来看,这可能是一个愚蠢的帖子。我对消极和积极的数字以及如何处理这个问题感到困惑(因为它已经很晚了,我的思绪已经变得糊涂了)但事实证明,自从{我不需要处理这个问题以来{3}}。谢谢大家在这里回复!我会把它留下来,以防它帮助其他人。答案 0 :(得分:1)
借助2的补码参考值,我们可以像下面这样做
private static final BigInteger TWO_COMPL_REF = BigInteger.ONE.shiftLeft(64);
public static byte[] parseBigIntegerPositive(BigInteger b) {
if (b.compareTo(BigInteger.ZERO) < 0)
b = b.add(TWO_COMPL_REF);
byte[] unsignedbyteArray= b.toByteArray();
return unsignedbyteArray;
}