2012-03-06 35 views
25

He generado un número aleatorio seguro y he puesto su valor en un byte. Aquí está mi código.Convirtiendo de byte a int en java

SecureRandom ranGen = new SecureRandom(); 
byte[] rno = new byte[4]; 
ranGen.nextBytes(rno); 
int i = rno[0].intValue(); 

pero estoy consiguiendo un error:

byte cannot be dereferenced 
+1

* * Lo que es usted que consigue error? –

+1

Hay una diferencia entre byte y byte. Este último es un objeto que admitiría el método '.intValue()'. El primero es el valor del byte sin formato y simplemente asignelo como 'int i = rno [0];' – wuppi

+0

Vea también http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int – DNA

Respuesta

57

Su matriz es de primitivas byte, pero está tratando de invocar un método sobre ellas.

Usted no necesita hacer nada explícita para convertir un byte a un int, simplemente:

int i=rno[0]; 

... ya que no es un abatido.


simplemente para la corrección # 1: Si qué desea utilizar los diversos métodos de Byte por alguna razón (que no es necesario aquí), se podría utilizar un boxing conversion:

Byte b = rno[0]; // Boxing conversion converts `byte` to `Byte` 
int i = b.intValue(); 

O el Byte constructor:

Byte b = new Byte(rno[0]); 
int i = b.intValue(); 

Pero de nuevo, no necesito eso aquí.


simplemente para la corrección # 2: Si eran un abatido (por ejemplo, si estuviera tratando de convertir un int a un byte), todo lo que necesita es un reparto:

int i; 
byte b; 

i = 5; 
b = (byte)i; 

Esto asegura al compilador que usted sabe que está abatido, por lo que no obtiene el error de "Posible pérdida de precisión".

+0

Usar el constructor Byte no es una buena idea. Simplemente haga 'Byte b = rno [0];' en su lugar. – xehpuk

+0

@xehpuk: Debería haber mencionado conversiones de boxeo, hecho eso ahora. –

+0

¿Por qué la conversión de boxeo es superior al constructor Byte en este caso? a mi entender, la conversión de boxeo termina usando el constructor de Byte al final de cualquier manera? es mi entendimiento incorrecto? – user3772575

6

tipos de datos primitivos (como bytes) no tienen métodos en Java, pero se puede hacer directamente:

int i=rno[0]; 
+1

pero existe una función llamada byte.intValue() en documentos java – Ashwin

+6

No, es 'Byte.intValue', mientras' Byte' es una clase, 'byte' es un tipo de datos primitivo. – MByD

+0

lo tengo. gracias – Ashwin

3

Los bytes se convierten de forma transparente en ints.

Sólo decir

int i= rno[0]; 
+8

Pero ten en cuenta que el signo se conserva, que no es siempre lo que deseas (Java no tiene bytes sin signo) – DNA

26

si desea combinar los 4 bytes en una sola Int lo que necesita hacer

int i= (rno[0]<<24)&0xff000000| 
     (rno[1]<<16)&0x00ff0000| 
     (rno[2]<< 8)&0x0000ff00| 
     (rno[3]<< 0)&0x000000ff; 

utilizo 3 operadores especiales | es el bit a bit OR lógico & es el lógico AND y << es el desplazamiento a la izquierda

en esencia, combino los 4 bytes de 8 bits en un solo 32 bits int por sh ifting los bytes en su lugar y la operación lógica OR juntos

También me aseguro de cualquier promoción signo no afectará el resultado con & 0xff

+1

¿Qué estás haciendo allí realmente? ¿Puedes explicar esa línea? – Ashwin

+4

Lo haría (rno [0] y 0x000000ff) << 24 | (rno [1] & 0x000000ff) << 16 | ... etc. entonces puedo hacer ese operando AND-ing constante. Alternativamente, también puede hacer ((int) rno [0]) << 24 | ((int) rno [1]) << 16 | ... ya que el tipo de conversión coloca automáticamente los valores de bytes en el espacio int primitivo. – ingyhere

22
byte b = (byte)0xC8; 
int v1 = b;  // v1 is -56 (0xFFFFFFC8) 
int v2 = b & 0xFF // v2 is 200 (0x000000C8) 

mayor parte del tiempo v2 es la forma en que realmente necesita.

+0

es porque la máquina de 32 bits generó el largo 0xffffffc8, gracias. – herbertD

2

pensé que sería:

byte b = (byte)255; 
int i = b &255;