Подтвердить что ты не робот

Прочитайте два байта в целое число?

У меня есть byte[], который я прочитал из файла, и я хочу получить int из двух байтов в нем. Вот пример:

byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F};
int value = bytes.getInt(2,4); //This method doesn't exist

Это должно сделать value равным 0x0110, или 272 в десятичной системе. Но, очевидно, byte[].getInt() не существует. Как я могу выполнить эту задачу?

Вышеприведенный массив является лишь примером. Фактические значения мне неизвестны.

4b9b3361

Ответ 1

Вы должны просто выбрать простой:

int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);

Вы могли бы даже написать свою собственную вспомогательную функцию getBytesAsWord (byte[] bytes, int start), чтобы дать вам функциональность, если вы не хотите, чтобы вычисления переполняли ваш код, но я думаю, что это, вероятно, будет излишним.

Ответ 2

Try:

public static int getInt(byte[] arr, int off) {
  return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF;
} // end of getInt

В вашем вопросе не указано, что означают два аргумента (2,4). 2 и 4 не имеют смысла в вашем примере как индексы в массиве, чтобы найти ox01 и 0x10, я предположил, что вы хотели взять два последовательных элемента, что обычно нужно делать, поэтому я использовал и выключил + 1 в моем методе.

Вы не можете расширить класс byte [] в java, поэтому у вас не может быть метода bytes.getInt, поэтому я сделал статический метод, который использует байт [] в качестве первого аргумента.

"Трюк" метода заключается в том, что вы байты представляют собой 8-разрядные целые числа со знаком, а значения над 0x80 являются отрицательными и будут расширены знаками (т.е. 0xFFFFFF80 при использовании в качестве int). Вот почему необходима маскировка "& 0xFF". "< 8" сдвигает более значительный байт на 8 бит влево. '|' объединяет два значения - так же, как "+". Порядок операторов важен, так как < < имеет наивысший приоритет, за которым следуют и следуют | - поэтому скобки не нужны.

Ответ 3

Здесь хороший простой надежный способ.

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4);
    // by choosing big endian, high order bytes must be put
    // to the buffer before low order bytes
    byteBuffer.order(ByteOrder.BIG_ENDIAN);
    // since ints are 4 bytes (32 bit), you need to put all 4, so put 0
    // for the high order bytes
    byteBuffer.put((byte)0x00);
    byteBuffer.put((byte)0x00);
    byteBuffer.put((byte)0x01);
    byteBuffer.put((byte)0x10);
    byteBuffer.flip();
    int result = byteBuffer.getInt();

Ответ 4

В качестве альтернативы вы можете использовать:

int val = (bytes[2] << 8) + bytes[3]

Ответ 5

Вы можете использовать ByteBuffer. Он имеет метод getInt, который вы ищете, и многие другие полезные методы.

Ответ 6

Класс Google Base16 - от Guava-14.0.1.

new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();