2016-01-03 1 views
2

Я помещаю разные двоичные числа в массив байтов. Один из чисел: 10001101010010010000000000001000 этот номер дает мне NumberFormatException на линии, где я пытаюсь его разобрать, очевидно, потому что он слишком большой. См. Код ниже, где string - это двоичное число.Ввод моих 32 бит в 4 bytearray

int number = Integer.parseInt(string, 2); 
ByteBuffer bytes = ByteBuffer.allocate(4).putInt(number); 
byte[] byteInstruction = bytes.array(); 

То, что я хочу, чтобы поместить цифры в моем массиве байт, но так как они являются 32-разрядными числами, я не хочу, чтобы занять более 4 байта в моем массиве. Когда я использую много времени для анализа, он работает, но затем я занимаю 8 пробелов в массиве байтов.

long number = Long.parseLong(string, 2); 
ByteBuffer bytes = ByteBuffer.allocate(8).putLong(number); 
byte[] byteInstruction = bytes.array(); 

Если я распечатать массив позже я получаю это:

[0, 0, 0, 0, -115, 73, 0, 8] 

, где мы можем видеть, что есть 4 места бесплатно. Как я могу это решить? Как я испортил? Вся помощь приветствуется.

+1

Дело в том, что число не помещается в 'int' потому, что в Java' Int 'подписан. –

+0

Ты ничего не испортил. Длинные 64 бит или 8 байтов –

+0

@ cricket_007 Но что я могу сделать? Поскольку я хочу сохранить свой номер только в 4 пробелах в массиве байтов, а не 8. – Fjodor

ответ

1

Ваша строка ввода "10001101010010010000000000001000" представляет собой значение, которое является слишком большим для , подписанноеInteger. Integer.MAX_VALUE = 2147483647 и введенная строка ввода имеет значение 2370371592.

Integer.parseIntне интерпретирует ведущий 1 в положении 32 справа, как знак. Если вы хотите разобрать отрицательное значение, ему должно быть предварено знаком -.

См. Это answer для получения дополнительной информации.

Если вы ожидаете вход "10001101010010010000000000001000" на самом деле означает, "-0001101010010010000000000001000" просто заменить первый символ с +/- в зависимости от значения 32 бита из правой.

В качестве альтернативы, если вы хотите, чтобы рассматривать бинарную строку в Two's complement compatible way вы можете использовать подход из этого answer:

int msb = Integer.parseInt("1000110101001001", 2); 
int lsb = Integer.parseInt("0000000000001000", 2); 

int result = msb<<16 | lsb; 
+0

Это не приводит к правильному результату –

+0

@MattTimmermans По правильным данным вы имеете в виду? – miensol

+0

Например, он превращает 10000000000000000000000000000000 в -0 –