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