Преобразувайте къси битове в int

Имам 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/

Също така, не знам вашия случай на употреба, но ако сте в началните етапи на вашия проект, бих използвал ProtoBufs на Google за обмен на информация за протокола. Той облекчава главоболията при преход между версиите на протокола, произвежда изключително компактен двоичен изход и е бърз.

Освен това, ако някога смените езиците, можете да намерите библиотека 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

В крайна сметка използвах този ресурс: http://www.javamex.com/java_equivalents/unsigned.shtml

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

Копирах двата байта в short, след това го преобразувах в int и премахнах знака.

person JeremyK    schedule 25.06.2013