java - socket - ¿Leer dos bytes en un entero?
java socket client example (6)
Tengo un byte[]
que leí de un archivo, y quiero obtener un int
desde dos bytes. Aquí hay un ejemplo:
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
Esto debería hacer que el value
igual a 0x0110
, o 272
en decimal. Pero obviamente, el byte[].getInt()
no existe. ¿Cómo puedo realizar esta tarea?
La matriz anterior es solo un ejemplo. Los valores reales son desconocidos para mí.
Alternativamente, podrías usar:
int val = (bytes[2] << 8) + bytes[3]
Aquí hay una forma segura simple agradable
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();
La clase de Google Base16 es de Guava-14.0.1.
new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();
Puede utilizar ByteBuffer. Tiene el método getInt que está buscando y muchos otros métodos útiles
Solo debes optar por lo simple:
int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff);
Incluso podría escribir su propia función de ayuda getBytesAsWord (byte[] bytes, int start)
para brindarle la funcionalidad si no desea que los cálculos salpiquen su código, pero creo que probablemente sería una exageración.
Tratar:
public static int getInt(byte[] arr, int off) {
return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF;
} // end of getInt
Su pregunta no indicó qué significaban los dos argumentos (2,4). 2 y 4 no tienen sentido en tu ejemplo como índices en la matriz para encontrar ox01 y 0x10, supongo que querías tomar dos elementos consecutivos, algo común, así que usé off y off + 1 en mi método.
No puede extender la clase de bytes [] en java, por lo que no puede tener un método bytes.getInt, así que hice un método estático que usa el byte [] como primer argumento.
El ''truco'' del método es que sus bytes son enteros con signo de 8 bits y los valores superiores a 0x80 son negativos y serían de signo extendido (es decir, 0xFFFFFF80 cuando se usan como int). Es por eso que se necesita el enmascaramiento ''& 0xFF''. el ''<< 8'' desplaza los bytes más significativos que quedan 8 bits. El ''|'' combina los dos valores, tal como lo haría ''+''. El orden de los operadores es importante porque << tiene la mayor prioridad, seguido de & seguido de | - Por lo tanto, no se necesitan paréntesis.