Преобразуйте значение Big Integer в восьмибитную последовательность байтов (2 с дополняющим байтом), кратную 8 в Java - PullRequest
0 голосов
/ 22 октября 2018

Как преобразовать большое целое в следующую массив байтов форму в Java:

Большие целые числа кодируются как последовательность восьмибитных байтов, в двазапись дополнения, передаваемая с прямым порядком байтов.Если длина последовательности не кратна восьми байтам, то большие целые числа ДОЛЖНЫ быть дополнены минимальным числом старших байтов с расширенным знаком, чтобы длина была кратна восьми байтам.

Это должно бытьв соответствии с протоколом KMIP , раздел 9.1.1.4 Значение элемента

1 Ответ

0 голосов
/ 22 октября 2018

Насколько я знаю, API-интерфейс BigInteger не предоставляет никаких функций заполнения, поэтому вы должны выполнить заполнение самостоятельно:

Для BigInteger bigInt используйте

byte[] array = bigInt.toByteArray();
int len = array.length, len8 = len+7 & ~7;
if(len != len8) {
    int pad = len8 - len;
    byte[] nArray = new byte[len8];
    if(bigInt.signum() < 0) Arrays.fill(nArray, 0, pad, (byte)-1);
    System.arraycopy(array, 0, nArray, pad, len);
    array = nArray;
}
  • Во-первых, используйте toByteArray() для получения байтового массива
  • рассчитайте следующий кратный восьми для длины массива
  • Если это число не совпадает с длиной, вынужно заполнить
    • выделить массив необходимого размера
    • заполнить заполнение -1 (расширение знака), если оно отрицательное (в другом случае оно уже имеет требуемые нули)
    • копирование оригинальных байтов

Обратите внимание, что расширенный массив со знаком все еще совместим с конструктором BigInteger(byte[]), поэтому assert bigInt.equals(new BigInteger(array)); после операции никогда не должен завершаться ошибкой.

...