Вопрос по numbers, algorithm, bytearray, java – Как преобразовать байтовый массив в его числовое значение (Java)?

83

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

например

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

// CONVERSION OPERATION
// return the numeric value
</code>

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

NB: TacB0sS ' ссылка была тем, что я действительно искал - и прямое, и обратное преобразование. Jay Taylor
Что вы подразумеваете под "числовым значением"? Представляют ли байты целое (длинное) или число с плавающей запятой (двойное) в двоичном виде? Являются ли они строковым представлением числа? Или еще одно представление? starblue
Это было полезно:stackoverflow.com/questions/5399798/… TacB0sS

Ваш Ответ

7   ответов
2

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;
}
Просто обратите внимание, что мне нужно было использовать 0xFFL, иначе при приведении типа int 0xFF к long было установлено много неправильных 1 бит, когда я печатал Long.toHexString (l).
8

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

new BigInteger(bytes).intValue();

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

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

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
+1 для массива с несколькими значениями
@dfa: Спасибо за указание на это, оно, похоже, работает - я отредактирую ответ. :)
как насчет ByteBuffer.wrap (новый байт [] {0, 0, 0, 1, 0, 0, 0, 4}). getLong ()? этот метод должен прочитать следующие 8 байт и преобразовать их в длинный
3
13

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

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

BigInteger n = new BigInteger(byteArray);

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

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
Я бы проголосовал за этот ответ, если бы он заканчивался сразу после первого фрагмента кода или если он содержал некоторый код для преобразования строки в «числовое значение». Как есть, вторая половина вашего ответа кажется не sequitur.
Не то, что я имел в виду в первую очередь, я изменил свой ответ
97

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

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

-1 байт являются знаковыми значениями! И замените pow () на shift (& lt; & lt;)! & quot; значение = (значение & lt; & lt; 8) + (по [i] и 0xff) & quot;
В случае, если у кого-то еще есть та же проблема, что и я, в первом примере by [i] должен быть приведен к long, в противном случае он работает только для значений, меньших 2 ^ 32. То есть,value += ((long)by[i] & 0xffL) << (8 * i);
Имеет ли оператор сдвига (& lt; & lt;) приоритет справа налево? Как работает приведенный выше код? Все работает хорошо для меня. Просто хочу знать, как работает. Спасибо заранее
Вы правы. Я исправил это, надеюсь, теперь это правильно.
@Mnementh: имеет ли оператор сдвига (& lt; & lt;) приоритет справа налево? Как работает приведенный выше код? Все работает хорошо для меня. Просто хочу знать, как работает. Спасибо заранее

Похожие вопросы