BigInteger (String) и BigInteger (байт []) не равны

Я ожидал двух конструкторов в классе BigInteger (String) BigInteger(byte[])и BigInteger, чтобы вести себя аналогично, но они этого не делают.

Почему два BigInteger не равны? Как я могу создать a BigIntegerиз массива байтов?

String hex = "94B4";
byte[] b = DatatypeConverter.parseHexBinary(hex); // -108, -76

BigInteger b1 = new BigInteger(hex, 16); //38068
BigInteger b2 = new BigInteger(b); //-27468

java,arrays,byte,biginteger,

2

Ответов: 2


2 принят

Похоже, что byte[]конструктор рассматривает входные данные как обычные данные дополнения 2, тогда как конструктор hex рассматривает его как нудную шестнадцатеричную строку.

Используя это, new BigInteger(int signum, byte[] magnitude)вы можете заставить значение быть положительным, так new BigInteger(1, b)будет 38068.


1

Неудивительно, что 38068 + 27468 составляет 65536.

Помните, что a java.lang.String- это массив символов, а charв Java - неподписанный 16-разрядный тип. Ницца.

BigInteger b2 = new BigInteger(b);обходит это. Он интерпретирует данные как 2 дополнение подписало 16 битный типа.

Отсюда и различие.

Java, массивы, байты, BigInteger,
Похожие вопросы