2012-03-06 85 views
25

我已經生成了一個安全的隨機數,並將其值放入一個字節中。這是我的代碼。在java中從字節轉換爲int

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

但我得到一個錯誤:

byte cannot be dereferenced 
+1

* *什麼錯誤你好嗎? – 2012-03-06 10:11:23

+1

字節和字節之間有區別。後者是一個支持'.intValue()'方法的對象。第一個是原始字節值,只是將它賦值爲'int i = rno [0];' – wuppi 2012-03-06 10:20:25

+0

另請參見http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int – DNA 2012-03-06 10:58:34

回答

57

你的數組是byte基元,但你試圖調用它們的方法。

你不需要做任何明確的轉換一個byteint,只是:

int i=rno[0]; 

...因爲它不是一個垂頭喪氣。


只是爲了完整性#1:如果你沒有要使用的Byte各種方法出於某種原因(你就不需要在這裏),你可以使用一個boxing conversion

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

還是Byte constructor

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

但同樣,你這裏不需要這個。


只是爲了完整性#2:如果向下轉換(例如,如果你試圖在int轉換爲byte),你需要的是一個投:

int i; 
byte b; 

i = 5; 
b = (byte)i; 

這可以確保編譯器知道這是一個低落的,所以你不會得到「可能的精度損失」錯誤。

+0

使用字節構造函數不是一個好主意。只要做'Byte b = rno [0];'而不是。 – xehpuk 2014-02-11 10:20:47

+0

@xehpuk:我應該提到拳擊轉換,現在就完成了。 – 2014-02-11 10:34:54

+0

在這種情況下,爲什麼拳擊轉換優於字節構造函數?根據我的理解,拳擊轉換最終以任何方式結束使用字節構造函數?我的理解是不正確的? – user3772575 2017-11-30 14:57:19

6

基本數據類型(如字節)沒有在Java方法,但你可以直接做:

int i=rno[0]; 
+1

但有在java文檔中稱爲byte.intValue()的函數 – Ashwin 2012-03-06 10:20:40

+6

不,它是Byte.intValue,Byte是類,byte是原始數據類型。 – MByD 2012-03-06 10:21:22

+0

明白了。謝謝 – Ashwin 2012-03-06 10:33:59

3

字節透明地轉換爲整數。

只是說

int i= rno[0]; 
+8

但是請注意,符號被保留下來,這並不總是你想要的(Java沒有無符號字節) – DNA 2012-03-06 10:53:59

26

,如果你想在4個字節組合成一個單一的詮釋,你需要做的

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

我用3個特殊運營商|是按位邏輯或&是邏輯與和<<是左移

實質上,我將4個8位字節組合成一個單一的32位int sh ifting到位字節,或運算在一起

我也確保任何標誌的推廣不會& 0xff

+1

你在那裏實際做了什麼。你能解釋一下這條線嗎? – Ashwin 2012-03-06 10:35:15

+4

我會做(rno [0]&0x000000ff)<< 24 |(rno [1]&0x000000ff)<< 16 | ...等,這樣我就可以使AND操作數保持不變。或者,你也可以做((int)rno [0])<< 24 |((int)rno [1])<< 16 | ...類型轉換會自動將字節值放入原始int空間。 – ingyhere 2014-04-08 15:20:47

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

大部分時間V2的影響結果是你真正需要的方式。

+0

這是因爲32位機器生成長0xffffffc8,謝謝。 – herbertD 2017-12-17 16:23:43

2

我認爲這將是:

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