2012-03-06 16 views
25

Wygenerowałem bezpieczną liczbę losową i umieściłem jej wartość w bajcie. Oto mój kod.Konwersja z bajtu na int w java

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

Ale otrzymuję błąd:

byte cannot be dereferenced 
+1

* Co * błędzie jest wyświetlany? –

+1

Istnieje różnica między bajtem i bajtem. Ten ostatni jest obiektem, który wspierałby metodę '.intValue()'. Pierwszy to wartość surowego bajtu i po prostu przypisz ją jako 'int i = rno [0];' – wuppi

+0

Zobacz także http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int – DNA

Odpowiedz

57

Twoja tablica zawiera prymitywy byte, ale próbujesz wywołać na nich metodę.

Nie trzeba nic robić wyraźne konwertować byte do int, po prostu:

int i=rno[0]; 

... ponieważ to nie jest przygnębiony.


Tylko dla kompletności # 1: Jeśli nie chcą korzystać z różnych metod Byte z jakiegoś powodu (nie trzeba tutaj), można użyć boxing conversion:

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

Albo Byte constructor:

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

Ale znowu, nie potrzebuję tego tutaj.


Tylko dla kompletności # 2: Jeśli były przygnębiony (na przykład, jeśli starali się przekształcić int do byte), wszystko czego potrzebujesz to obsada:

int i; 
byte b; 

i = 5; 
b = (byte)i; 

Zapewnia to kompilatorowi, że wiesz, że jest downcastem, więc nie otrzymasz błędu "Możliwa utrata precyzji".

+0

Korzystanie z konstruktora Byte nie jest dobrym pomysłem. Po prostu wykonaj 'Byte b = rno [0];' zamiast tego. – xehpuk

+0

@xehpuk: Powinienem wspomnieć o konwersji bokserskiej, zrobić to teraz. –

+0

Dlaczego w tym przypadku konwersja boksu jest lepsza od konstruktora bajtów? do mojego zrozumienia konwersja boksu kończy się w końcu przy użyciu konstruktora bajtów? czy moje zrozumienie jest nieprawidłowe? – user3772575

6

prymitywnych typów danych (takich jak bajt) nie mają metod w Javie, ale można zrobić bezpośrednio:

int i=rno[0]; 
+1

, ale jest funtion o nazwie byte.intValue() w dokumentacji java – Ashwin

+6

Nie, jest to 'Byte.intValue', natomiast' Byte' to klasa, 'byte' to pierwotny typ danych. – MByD

+0

rozumiem. dziękuję – Ashwin

3

Bajty są przezroczysto konwertowane na ints.

Wystarczy powiedzieć

int i= rno[0]; 
+8

Ale zauważ, że znak jest zachowany, co nie zawsze jest tym, czego potrzebujesz (Java nie ma niepodpisanych bajtów) – DNA

26

jeśli chcesz połączyć 4 bajty w jeden int trzeba zrobić

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

używam 3 specjalne operatory | jest bitowe logiczne LUB & jest logiczne AND i << to lewe przesunięcie

w istocie łączę 4 8-bitowe bajty w jeden 32-bitowy int przez sh ifting bajtów w miejscu i Oring je razem

ja również zapewnić dowolny znak promocja nie będzie miało wpływu na wynik z & 0xff

+1

Co tak naprawdę tam robisz. Czy możesz wyjaśnić tę linię? – Ashwin

+4

Zrobiłbym (rno [0] i 0x000000ff) << 24 | (rno [1] i 0x000000ff) << 16 | ... itd., więc mogę uczynić ten operand AND-ing stałym. Alternatywnie możesz też po prostu zrobić ((int) rno [0]) << 24 | ((int) rno [1]) << 16 | ... ponieważ rzutowanie typu automatycznie umieszcza wartości bajtów w pierwotnej przestrzeni int. – ingyhere

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

większość czasu v2 jest sposób, czego naprawdę potrzebujesz.

+0

ponieważ 32-bitowy komputer wygenerował długi 0xffffffc8, dzięki. – herbertD

2

myślałem byłoby:

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