Преобразовать короткие биты в целые

У меня есть TCP-пакет, который отправляет кучу беззнаковых переменных (они беззнаковые, потому что они экономят место и используют ограничения для уникальных идентификаторов), мне нужно преобразовать эти короткие битовые данные без знака в целое число в java.

Итак, мой вопрос: как преобразовать byteArray[0–15] в int?

Редактировать:

Вот код, который я изменил на:

ByteOrder order = ByteOrder.BIG_ENDIAN;
requestedDateType = new BigInteger(ByteBuffer.allocate(2).put(data, 8, 2).order(order).array()).intValue();

Входящий буфер данных:

bit   0    1   2   3   4   5   6   7   8   9

value 40   0   0   0   8   0   0   0   1   0

Данные отправляются как Little Endian. Я предполагаю, что поскольку BigInteger предполагает большой размер, мне нужно преобразовать его в это. Однако и большой, и маленький Орден дают мне взамен одинаковую ценность.

Я ожидаю получить 1 для значения requestedDateType, однако я получаю 256. Как мне заполнить два недостающих байта, чтобы убедиться, что он дает мне 0000 0000 0000 0001 вместо 0000 0001 0000 0000

Редактировать 2:

Не бери в голову. Изменил код на это:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data, 8, 2);
int value = ((int)bb.getShort(0)) & 0xff;

person JeremyK    schedule 24.06.2013    source источник


Ответы (2)


Используйте ByteBuffer в пакете java.nio.

//Convert unsigned short to bytes:
//java has no unsigned short. Char is the equivalent.
char unsignedShort = 100;
//Endianess of bytes. I recommend setting explicitly for clarity
ByteOrder order = ByteOrder.BIG_ENDIAN;
byte[] ary = ByteBuffer.allocate(2).putChar(value).order(order).array();

//get integers from 16 bytes
byte[] bytes = new byte[16];
ByteBuffer buffer= ByteBuffer.wrap(bytes);
for(int i=0;i<4;i++){
    int intValue = (int)buffer.getInt();
}

В Guava также есть подпрограммы для преобразования примитивов в байты, если вас интересует внешняя библиотека: http://code.google.com/p/guava-libraries/

Кроме того, я не знаю вашего варианта использования, но если вы находитесь на начальных этапах своего проекта, я бы использовал Google ProtoBufs для обмена информацией о протоколе. Он облегчает головную боль при переходе между версиями протокола, производит очень компактный двоичный вывод и работает быстро.

Кроме того, если вы когда-нибудь меняете языки, вы можете найти библиотеку protobufs для этого языка и не переписывать весь код вашего протокола.

http://code.google.com/p/protobuf/

person William Morrison    schedule 24.06.2013
comment
Сделал бы ByteBuffer.wrap(bytes).getInt() то же самое? - person Petr Janeček; 25.06.2013
comment
Да, сэр, я добавлю пример для этого. - person William Morrison; 25.06.2013