2017-02-02 16 views
2

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

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

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

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

ответ

2

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

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

1

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

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

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

Отсюда разница.

 Смежные вопросы

  • Нет связанных вопросов^_^