Преобразуйте значение Big Integer в последовательность из восьми битных байтов (2 с дополняющим байтом), кратную 8 в Java

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

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

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

1 ответ

Решение

Насколько я знаю, функциональность заполнения не обеспечивается BigInteger API, так что вы должны сделать заполнение самостоятельно:

Для 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)); после операции никогда не должно провалиться.

Другие вопросы по тегам