Как преобразовать байтовый массив в его числовое значение (Java)? - PullRequest
84 голосов
/ 22 июня 2009

У меня есть 8-байтовый массив, и я хочу преобразовать его в соответствующее числовое значение.

, например

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

Я хочу метод, который будет выполнять вышеуказанную операцию преобразования.

Ответы [ 7 ]

109 голосов
/ 22 июня 2009

Можно использовать Buffer с, которые предоставляются как часть пакета java.nio для выполнения преобразования.

Здесь исходный массив byte[] имеет длину 8, что соответствует размеру long.

Сначала массив byte[] переносится в ByteBuffer, а затем вызывается метод ByteBuffer.getLong для получения значения long:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();

System.out.println(l);

Результат

4

Я хотел бы поблагодарить dfa за указание метода ByteBuffer.getLong в комментариях.


Хотя это может быть неприменимо в этой ситуации, прелесть Buffer заключается в просмотре массива с несколькими значениями.

Например, если у нас есть 8-байтовый массив, и мы хотим просмотреть его как два значения int, мы можем заключить массив byte[] в ByteBuffer, который рассматривается как IntBuffer и получить значения по IntBuffer.get:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);

System.out.println(i0);
System.out.println(i1);

Результат:

1
4
100 голосов
/ 22 июня 2009

Предполагая, что первый байт является наименее значимым байтом:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value += ((long) by[i] & 0xffL) << (8 * i);
}

Первый байт самый старший, затем он немного другой:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value = (value << 8) + (by[i] & 0xff);
}

Замените long на BigInteger , если у вас больше 8 байтов.

Спасибо Аарону Дигулле за исправление моих ошибок.

16 голосов
/ 22 июня 2009

Если это 8-байтовое числовое значение, вы можете попробовать:

BigInteger n = new BigInteger(byteArray);

Если это буфер символов UTF-8, вы можете попробовать:

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
13 голосов
/ 26 апреля 2012

Проще говоря, вы можете использовать или ссылаться на guava lib, предоставляемый Google, который предлагает методы для преобразования между длинным и байтовым массивом. Мой код клиента:

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));
8 голосов
/ 01 августа 2013

Вы также можете использовать BigInteger для байтов переменной длины. Вы можете преобразовать его в Long, Integer или Short, в зависимости от ваших потребностей.

new BigInteger(bytes).intValue();

или для обозначения полярности:

new BigInteger(1, bytes).intValue();
3 голосов
/ 23 февраля 2011

Полный код Java-конвертера для всех примитивных типов в / из массивов http://www.daniweb.com/code/snippet216874.html

1 голос
/ 13 июля 2014

Каждая ячейка в массиве обрабатывается как целое число без знака:

private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
    return res;


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}
...