Прочитайте два байта в целое число?
У меня есть 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()
не существует. Как я могу выполнить эту задачу?
Вышеприведенный массив является лишь примером. Фактические значения мне неизвестны.
Ответы
Ответ 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();