Как преобразовать массив байтов в его числовое значение (Java)?



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



например



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

// CONVERSION OPERATION
// return the numeric value


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

780   7  

7 ответов:

если первый байт младший байт:

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 байт.

спасибо Аарон Digulla за исправление моих ошибок.

можно использовать Buffers, которые предоставляются в составе 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 способ в комментариях.


хотя это может быть неприменимо в данной ситуации, красота Buffers приходят с глядя на массив с несколькими значениями.

например, если бы у нас был 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

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

BigInteger n = new BigInteger(byteArray);

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

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));

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

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));

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

new BigInteger(bytes).intValue();

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

new BigInteger(1, bytes).intValue();

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

каждая ячейка в массиве обрабатывается как unsigned int:

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;
}

Comments

    Ничего не найдено.