Вставка целочисленного значения без знака в байтовый буфер с сохранением двоичного представления

Я пытаюсь поместить следующее двоичное представление в байтовый буфер на 4 байта. Но так как Java не работает без знака, у меня проблемы: 11111111000000001111111100000000

ByteBuffer bb = ByteBuffer.allocate(8);

bb.putInt(Integer.parseInt("11111111000000001111111100000000", 2));
//throws numberformatexception

Отрицание самого значимого бита, по-видимому, изменяет значение двоичной строки из-за того, как работает дополнение two:

bb.putInt(Integer.parseInt("-1111111000000001111111100000000", 2));
System.out.println(Integer.toBinaryString(bb.getInt(0)));
//prints 10000000111111110000000100000000

Важно, чтобы значение было именно в этом двоичном формате, потому что позже оно будет рассматриваться как целое число без знака. Как мне добавить значение (и будущие значения, начинающиеся с 1) в байтовый буфер?


person user2947084    schedule 18.12.2014    source источник


Ответы (3)


Просто сначала проанализируйте его как long и приведите результат:

int value = (int) Long.parseLong("11111111000000001111111100000000", 2);

Это учитывает тот факт, что int не хватает места, потому что в long места предостаточно. После приведения значение окажется отрицательным int, но это нормально — оно соответствующим образом окажется в байтовом буфере.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, в Java 8 вы можете использовать Integer.parseUnsignedInt("...", 2).

person Jon Skeet    schedule 18.12.2014
comment
Спасибо, Джон Скит! Именно то, что я искал. - person user2947084; 18.12.2014
comment
Что бы это ни стоило, Java8 добавляет Integer.parseUnsignedInt, что также будет работать. - person Louis Wasserman; 18.12.2014

Вы также можете использовать UnsignedInts.parseUnsignedInt(String string, int radix) и UnsignedInts.toString(int x,int radix):

int v = UnsignedInts.parseUnsignedInt("11111111000000001111111100000000", 2);
System.out.println(UnsignedInts.toString(v, 2));
person Jean Logeart    schedule 18.12.2014

попробуй это

    bb.putInt((int)Long.parseLong("11111111000000001111111100000000", 2));
person Evgeniy Dorofeev    schedule 18.12.2014