Как преобразовать массив байтов в его числовое значение (Java)?
У меня есть 8 байтовый массив, и я хочу, чтобы преобразовать его в соответствующее числовое значение.
например
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
Мне нужен метод, который будет выполнять вышеуказанную операцию преобразования.
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