long entero convertir convert array java byte int

entero - int long java



Cómo convertir Int a Byte sin signo y viceversa (8)

Java 8 proporciona Byte.toUnsignedInt para convertir byte a int mediante conversión sin firmar. En Oracle JDK esto simplemente se implementa como return ((int) x) & 0xff; porque HotSpot ya entiende cómo optimizar este patrón, pero podría estar intrínseco en otras máquinas virtuales. Lo que es más importante, no se necesita ningún conocimiento previo para comprender a qué hace una llamada a toUnsignedInt(foo) .

En total, Java 8 proporciona métodos para convertir byte y short a unsigned int y long , e int a unsigned long . Se omitió deliberadamente un método para convertir el byte en short sin signo porque la JVM solo proporciona aritmética en int y long todos modos.

Para convertir un int de nuevo a un byte, simplemente use un molde: (byte)someInt . La conversión primitiva de estrechamiento resultante descartará todos menos los últimos 8 bits.

Necesito convertir un número en un byte sin signo. El número siempre es menor o igual a 255, por lo que cabe en un byte.

También necesito convertir ese byte a ese número. ¿Cómo haría eso en Java? Lo intenté de varias maneras y no funcionó. Esto es lo que estoy tratando de hacer ahora:

int size = 5; // Convert size int to binary String sizeStr = Integer.toString(size); byte binaryByte = Byte.valueOf(sizeStr);

y ahora para convertir ese byte nuevamente en el número:

Byte test = new Byte(binaryByte); int msgSize = test.intValue();

Claramente, esto no funciona. Por alguna razón, siempre convierte el número en 65 . ¿Alguna sugerencia?


La llamada Integer.toString(size) convierte en la representación char de su entero, es decir, el carácter ''5'' . La representación ASCII de ese carácter es el valor 65.

Primero debe analizar la cadena de nuevo a un valor entero, por ejemplo, utilizando Integer.parseInt , para recuperar el valor int original.

Como conclusión, para una conversión firmada / no firmada, es mejor dejar a String fuera de la imagen y usar la manipulación de bits como lo sugiere @JB.


La solución funciona bien (¡gracias!), Pero si quieres evitar el lanzamiento y dejar el trabajo de nivel bajo al JDK, puedes usar un DataOutputStream para escribir tus int y un DataInputStream para volver a leerlos. Se tratan automáticamente como sin firmar. bytes luego:

Para convertir int a bytes binarios;

ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); int val = 250; dos.write(byteVal); ... dos.flush();

Leyéndolos de nuevo en:

// important to use a (non-Unicode!) encoding like US_ASCII or ISO-8859-1, // i.e., one that uses one byte per character ByteArrayInputStream bis = new ByteArrayInputStream( bos.toString("ISO-8859-1").getBytes("ISO-8859-1")); DataInputStream dis = new DataInputStream(bis); int byteVal = dis.readUnsignedByte();

Esp. útil para manejar formatos de datos binarios (por ejemplo, formatos de mensajes planos, etc.)


Manejo de bytes y enteros sin signo con BigInteger:

byte[] b = ... // your integer in big-endian BigInteger ui = new BigInteger(b) // let BigInteger do the work int i = ui.intValue() // unsigned value assigned to i


Si desea utilizar las clases de envoltura primitiva, esto funcionará, pero todos los tipos de Java están firmados por defecto.

public static void main(String[] args) { Integer i=5; Byte b = Byte.valueOf(i+""); //converts i to String and calls Byte.valueOf() System.out.println(b); System.out.println(Integer.valueOf(b)); }


Si solo necesita convertir un valor esperado de 8 bits de un int firmado a un valor sin signo, puede usar un simple cambio de bit:

int signed = -119; // 11111111 11111111 11111111 10001001 /** * Use unsigned right shift operator to drop unset bits in positions 8-31 */ int psuedoUnsigned = (signed << 24) >>> 24; // 00000000 00000000 00000000 10001001 -> 137 base 10 /** * Convert back to signed by using the sign-extension properties of the right shift operator */ int backToSigned = (psuedoUnsigned << 24) >> 24; // back to original bit pattern

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

Si utiliza algo que no sea int como tipo de base, obviamente tendrá que ajustar la cantidad de desplazamiento: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Además, tenga en cuenta que no puede usar el tipo de byte , al hacerlo tendrá como resultado un valor firmado como lo mencionan otros respondedores. El tipo primitivo más pequeño que podría usar para representar un valor sin signo de 8 bits sería un short .


Un byte siempre se firma en Java. Sin embargo, puede obtener su valor sin signo binario-anding con 0xFF:

int i = 234; byte b = (byte) i; System.out.println(b); // -22 int i2 = b & 0xFF; System.out.println(i2); // 234


en java 7

public class Main { public static void main(String[] args) { byte b = -2; int i = 0 ; i = ( b & 0b1111_1111 ) ; System.err.println(i); } }

resultado: 254