2012-03-06 23 views
25

Ho generato un numero casuale sicuro e ho inserito il suo valore in un byte. Ecco il mio codice.Conversione da byte a int in java

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

Ma sto ottenendo un errore:

byte cannot be dereferenced 
+1

* Cosa * errore vuoi arrivare? –

+1

C'è una differenza tra byte e byte. Quest'ultimo è un oggetto che supporta il metodo '.intValue()'. Il primo è il valore del byte grezzo e basta assegnarlo come 'int i = rno [0];' – wuppi

+0

Vedere anche http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int – DNA

risposta

57

Il tuo array è costituito da primitive byte, ma stai cercando di richiamare un metodo su di esse.

Non c'è bisogno di fare qualsiasi cosa esplicita per convertire un byte a un int, basta:

int i=rno[0]; 

... dato che non è un abbattuto.


Solo per completezza # 1: Se hai desidera utilizzare i vari metodi di Byte per qualche motivo (non c'è bisogno di qui), si potrebbe usare un boxing conversion:

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

O il Byte constructor:

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

Ma ancora una volta, è non ne ho bisogno qui.


Solo per completezza # 2: Se fosse un bassi (ad esempio, se si stava tentando di convertire un int ad un byte), tutto ciò che serve è un cast:

int i; 
byte b; 

i = 5; 
b = (byte)i; 

Questo assicura al compilatore di sapere che si tratta di un downcast, quindi non si ottiene l'errore "Possibile perdita di precisione".

+0

L'utilizzo del costruttore Byte non è una buona idea. Basta fare 'Byte b = rno [0];' invece. – xehpuk

+0

@xehpuk: avrei dovuto parlare di conversioni di boxe, fatto ora. –

+0

Perché la conversione di boxing è superiore al costruttore Byte in questo caso? per quanto ne so la conversione di boxe finisce con l'uso del costruttore Byte alla fine in ogni modo? la mia comprensione è errata? – user3772575

6

tipi di dati primitivi (come byte) non hanno metodi in Java, ma si può fare direttamente:

int i=rno[0]; 
+1

ma c'è una funzione chiamata byte.intValue() in java docs – Ashwin

+6

No, è 'Byte.intValue', mentre' Byte' è una classe, 'byte' è un tipo di dati primitivo. – MByD

+0

capito. grazie – Ashwin

3

I byte vengono convertiti in modo trasparente in int.

Basta dire

int i= rno[0]; 
+8

Ma si noti che il segno viene conservato, che non è sempre quello che si desidera (Java non ha byte senza segno) – DNA

26

se si desidera combinare i 4 byte in un unico INT devi fare

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

Io uso 3 operatori speciali | è il bit OR logico & è la AND logico e << è lo spostamento a sinistra

in sostanza unisco i 4 byte a 8 bit in un singolo 32 bit int di sh ifting il byte in posizione e legandoli con OR

Ho anche assicuro promozione segno non influenzerà il risultato con & 0xff

+1

Cosa stai facendo in quel momento. Puoi per favore spiegare quella frase? – Ashwin

+4

Vorrei fare (rno [0] e 0x000000ff) << 24 | (rno [1] e 0x000000ff) << 16 | ... ecc., così posso quindi rendere questo operando AND-ing una costante. In alternativa, potresti anche solo fare ((int) rno [0]) << 24 | ((int) rno [1]) << 16 | ... poiché il type casting mette automaticamente i valori del byte nello spazio int primitivo. – ingyhere

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

maggior parte del tempo v2 è il modo in cui si ha realmente bisogno.

+0

è perché la macchina a 32 bit ha generato il 0xffffffc8 lungo, grazie. – herbertD

2

ho pensato che sarebbe stato:

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