Вопрос по numbers, algorithm, bytearray, java – Как преобразовать байтовый массив в его числовое значение (Java)?
У меня есть 8-байтовый массив, и я хочу преобразовать его в соответствующее числовое значение.
например
<code>byte[] by = new byte[8]; // the byte array is stored in 'by' // CONVERSION OPERATION // return the numeric value </code>
Я хочу метод, который будет выполнять вышеуказанную операцию преобразования.
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;
}
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
BigInteger n = new BigInteger(byteArray);
Если это символьный буфер UTF-8, то вы можете попробовать:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
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);
}
Заменить долго наBigInteger, если у вас есть более 8 байтов.
Спасибо Аарону Дигулле за исправление моих ошибок.
value += ((long)by[i] & 0xffL) << (8 * i);