在java中从byte转换为int

时间:2012-03-06 10:10:22

标签: java type-conversion

我已经生成了一个安全的随机数,并将其值放入一个字节中。这是我的代码。

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

但是我收到了一个错误:

 byte cannot be dereferenced

6 个答案:

答案 0 :(得分:66)

你的数组是byte个原语,但是你试图在它们上面调用一个方法。

您无需明确将byte转换为int,只需:

int i=rno[0];

......因为它不是一个沮丧的人。

请注意,byte - 到 - int转换的默认行为是保留值的符号(记住byte是Java中的签名类型)。例如:

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

如果您认为byte为无符号(156)而不是有符号(-100),要获得int中的等效值,您需要屏蔽符号位:

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

仅为了完整性#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;

这可以确保编译器知道它是一个向下转换,因此你不会得到“可能的精度损失”错误。

答案 1 :(得分:33)

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

大部分时间v2都是您真正需要的方式。

答案 2 :(得分:30)

如果你想将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

的结果

答案 3 :(得分:6)

原始数据类型(如byte)在java中没有方法,但你可以直接执行:

int i=rno[0];

答案 4 :(得分:3)

字节透明地转换为整数。

说完

int i= rno[0];

答案 5 :(得分:2)

我以为会:

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