У меня есть 8-байтовый массив, и я хочу преобразовать его в соответствующее числовое значение.
например
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
Мне нужен метод, который будет выполнять указанную выше операцию преобразования.
new BigInteger(by).longValue()
Ответы:
Предполагая, что первый байт является наименее значимым байтом:
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 байт.
Спасибо Аарону Дигулле за исправление моих ошибок.
источник
value += ((long)by[i] & 0xffL) << (8 * i);
Для выполнения преобразования можно использовать
Buffer
s, которые предоставляются как частьjava.nio
пакета.Здесь исходный
byte[]
массив имеет длину 8, которая соответствует размеруlong
значения.Сначала
byte[]
массив оборачивается в aByteBuffer
, а затем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
s заключается в просмотре массива с несколькими значениями.Например, если у нас есть 8-байтовый массив, и мы хотим просмотреть его как два
int
значения, мы могли бы обернутьbyte[]
массив вByteBuffer
, который рассматривается как a,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"));
источник
Проще говоря , вы можете использовать или ссылаться на guava lib, предоставленную Google, которая предлагает утилитарные методы для преобразования между длинным и байтовым массивом. Мой клиентский код:
long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte));
источник
Вы также можете использовать BigInteger для байтов переменной длины. Вы можете преобразовать его в Long, Integer или Short, в зависимости от ваших потребностей.
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; }
источник