Как получить массив байтов без знака из BigInteger в Java?

Мне нужно преобразовать BigInteger в целое число без знака, закодированное в формате big-endian, но у меня возникают проблемы, поскольку BigInteger.toByteArray возвращает подписанное представление. Как я могу преобразовать это значение в беззнаковый формат?

(Относительно) полезный фон

Я работаю над некоторым кодом, который использует JNI, чтобы c ++ вызывал некоторые методы Java для обработки некоторых криптографических функций (это поставщик Microsoft CNG, который переносит некоторые функции на Java). У меня есть открытый ключ в Java, и значения BigInteger, которые мне нужно преобразовать, - это координаты открытого ключа эллиптической кривой. Согласно документация по CNG Мне нужно предоставить эти точки как« целые числа без знака, закодированные в формате big-endian ».

Изменить

Оглядываясь назад, я могу сказать, что это был глупый пост. Я запутался в отрицательных и положительных числах и о том, как с этим справиться (и потому что уже поздно, и мой разум превратился в кашу), но оказалось, что мне не нужно иметь дело с этим, поскольку точки эллиптической кривой не будут отрицательными. Спасибо всем, кто ответил здесь! Я оставлю это на случай, если это кому-то поможет.


person Hmmmmm    schedule 03.09.2016    source источник
comment
Если рассматриваемое целое число положительное, в чем разница? Если он отрицательный, то каков должен быть результат преобразования в беззнаковый?   -  person Artur Biesiadowski    schedule 03.09.2016
comment
Взгляните на ответ, который я дал на аналогичный вопрос.   -  person Rudy Velthuis    schedule 03.09.2016
comment
Другими словами, это дубликат stackoverflow.com/q/38918190/95954   -  person Rudy Velthuis    schedule 03.09.2016
comment
Краткий ответ: добавьте 0 байт к байтовому массиву и загрузите его обратно в BigInteger. Тогда положительно.   -  person Rudy Velthuis    schedule 03.09.2016


Ответы (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;
    }
person Jekin Kalariya    schedule 03.09.2016
comment
Это не возвращает то же значение, не так ли? - person Rudy Velthuis; 03.09.2016
comment
@rudy Я думаю, что да, потому что он просто выдаст неподписанную версию байтового массива - person Jekin Kalariya; 03.09.2016
comment
Добавив 1 ^ 64 к отрицательному BigInteger? Да, ну, если вы усечите его до целого числа без подписи, то возможно. В противном случае, конечно, нет. - person Rudy Velthuis; 03.09.2016