немного манипуляций в Java - PullRequest
1 голос
/ 29 мая 2010

У меня есть фрагмент байта в байте []. Общий размер массива равен 4, и я хочу преобразовать это в положительное длинное число. Например, если байтовый массив имеет четыре байта 101, 110, 10, 10000001, то я хочу получить длинное число, представленное двоичной последовательностью

00000000 00000000 00000000 00000000 00000101 00000110 00000010 10000001

, что равно 84279937

Какой эффективный способ сделать это в Java?

Ответы [ 3 ]

4 голосов
/ 29 мая 2010

Предположим, что порядок байтов младший,

(b[0] & 0xFF) | (b[1] & 0xFF) << 8 | (b[2] & 0xFF) << 16 | (b[3] & 0xFF) << 24

Пример, http://www.ideone.com/p68zS

& 0xFF предназначен для преобразования подписанных байтов в неподписанные ...

2 голосов
/ 29 мая 2010
ByteBuffer buf = ByteBuffer.allocate(8); 
buf.put(4, b[0]).put(5, b[1]).put(6, b[2]).put(7, b[3]);
long longVal = buf.getLong();
2 голосов
/ 29 мая 2010

Не знаю об эффективности, но поскольку один из конструкторов BigInteger получает байтовый массив, это может быть очень простым способом:

import java.math.BigInteger;

...

long value = new BigInteger(myByteArray).longValue();

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

...