【问题标题】:How to get an unsigned byte array from a BigInteger in Java?如何从 Java 中的 BigInteger 获取无符号字节数组?
【发布时间】: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 以来我不需要处理这个问题。感谢所有在这里回复的人!我会留下这个,以防它帮助其他人。

【问题讨论】:

标签: java biginteger unsigned-integer unsigned-char


【解决方案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?是的,好吧,如果你将它截断为一个无符号整数,那么也许。否则,肯定不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2013-10-10
  • 2017-12-03
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多