如何从 Java 中的 BigInteger 获取无符号字节数组?

Posted

技术标签:

【中文标题】如何从 Java 中的 BigInteger 获取无符号字节数组?【英文标题】:How to get an unsigned byte array from a BigInteger in Java? 【发布时间】:2016-09-03 06:15:15 【问题描述】:

我需要将BigInteger 转换为以大端格式编码的无符号整数,但我遇到了问题,因为BigInteger.toByteArray 返回有符号表示。如何将此值转换为无符号格式?

(相对)有用的背景

我正在编写一些代码,这些代码使用 JNI 让 c++ 调用一些 Java 方法来处理一些加密功能(这是一个 Microsoft CNG 提供程序,它将一些功能卸载到 Java)。我有 Java 中的公钥,我需要转换的 BigInteger 值是coordinates of the Elliptic Curve Public Key。根据CNG documentation,我需要将这些点提供为“以大端格式编码的无符号整数”。

编辑

事后看来,这可能是一个愚蠢的帖子。我对负数和正数以及如何处理它感到困惑(因为已经很晚了,我的思绪已经变得糊涂了),但事实证明,自从elliptic curve points won't be negative 以来我不需要处理这个问题。感谢所有在这里回复的人!我会留下这个,以防它帮助其他人。

【问题讨论】:

如果有问题的整数是正数,有什么区别?如果是负数,那么转换为无符号的结果应该是什么? 看看the answer I gave to a similar qustion。 换句话说,这是***.com/q/38918190/95954的副本 简短回答:在字节数组中添加一个 0 字节并将其加载回 BigInteger。然后是积极的。 【参考方案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;
    

【讨论】:

这不会返回相同的值,是吗? @rudy 我认为是的,因为它只会提供无符号版本的字节数组 通过将 1^64 添加到负 BigInteger?是的,好吧,如果你将它截断为一个无符号整数,那么也许。否则,肯定不会。

以上是关于如何从 Java 中的 BigInteger 获取无符号字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

pow中Java Biginteger的最大值[重复]

java 类型转换 String转BigInteger

利用java中的BigInteger实现进制转换

java中的BigInteger

JAVA中的BigInteger与BigDecimal类功能强大

Java 的 BigInteger 符号幅度如何工作