studio socket programacion example java integer byte bytearray

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.