我已经生成了一个安全的随机数,并将其值放入一个字节中。这是我的代码。
SecureRandom ranGen = new SecureRandom();
byte[] rno = new byte[4];
ranGen.nextBytes(rno);
int i = rno[0].intValue();
但是我收到了一个错误:
byte cannot be dereferenced
答案 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 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;