簡體   English   中英

在 Java 中從字節轉換為 int

[英]Converting from byte to int in Java

我生成了一個安全的隨機數,並將其值放入一個字節中。 這是我的代碼。

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

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

您無需執行任何顯式操作即可將byte轉換為int ,只需:

int i=rno[0];

...因為這不是沮喪。

請注意, byteint轉換的默認行為是保留值的符號(請記住, byte是 Java 中的有符號類型)。 所以例如:

byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100

如果您將byte視為無符號(156)而不是有符號(-100),那么從 Java 8 開始,就有Byte.toUnsignedInt

byte b2 = -100; // Or `= (byte)156;`
int = Byte.toUnsignedInt(b2);
System.out.println(i2); // 156

在 Java 8 之前,要在int獲得等效值,您需要屏蔽符號位:

byte b2 = -100; // Or `= (byte)156;`
int i2 = (b2 & 0xFF);
System.out.println(i2); // 156

只是為了完整性 #1:如果您出於某種原因確實想使用Byte的各種方法(您不需要在這里),您可以使用裝箱轉換

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

Byte構造函數

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

但同樣,你在這里不需要那個。


只是為了完整性#2:如果它向下轉換(例如,如果您嘗試將int轉換為byte ),那么您只需要一個轉換:

int i;
byte b;

i = 5;
b = (byte)i;

這向編譯器保證您知道這是一個向下轉換,因此您不會收到“可能的精度損失”錯誤。

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

大多數時候 v2 是您真正需要的方式。

如果你想將 4 個字節組合成一個 int 你需要做

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

我使用 3 個特殊運算符| 是按位邏輯 OR &是邏輯 AND 而<<是左移

本質上,我通過將字節移位並將它們組合在一起,將 4 個 8 位字節組合成一個 32 位 int

我還確保任何符號提升都不會影響& 0xff的結果

原始數據類型(如byte)在java中沒有方法,但是可以直接做:

int i=rno[0];

我以為會是:

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

字節被透明地轉換為整數。

說啊

int i= rno[0];

int b = Byte.toUnsignedInt(a);

"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM