我已经生成了一个安全的随机数,并将其值存储在字节中。以下是我的代码。
SecureRandom ranGen = new SecureRandom();
byte[] rno = new byte[4];
ranGen.nextBytes(rno);
int i = rno[0].intValue();
不过,我遇到了一个错误:
byte cannot be dereferenced
我已经生成了一个安全的随机数,并将其值存储在字节中。以下是我的代码。
SecureRandom ranGen = new SecureRandom();
byte[] rno = new byte[4];
ranGen.nextBytes(rno);
int i = rno[0].intValue();
不过,我遇到了一个错误:
byte cannot be dereferenced
你的数组是 byte
基本类型,但你正在尝试调用它们的方法。
你不需要进行任何显式转换将 byte
转换为 int
,只需:
int i=rno[0];
...因为它不是一个沮丧的情况。
请注意,默认情况下,byte
到int
的转换行为是保留值的符号(请记住,在Java中,byte
是有符号类型)。所以例如:
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 i2 = Byte.toUnsignedInt(b2);
System.out.println(i2); // 156
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();
int i;
byte b;
i = 5;
b = (byte)i;
Byte b = rno[0];
即可。 - xehpukByte.valueOf
而不是new Byte()
; 更多信息请参见此处。(规范实际上并没有说,但它确实这样做。您可以通过查看字节码来确定。) - T.J. Crowderbyte b = (byte)0xC8;
int v1 = b; // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)
大多数情况下,v2 是你真正需要的方式。
& 0xff
会导致错误。 - Luke Hutchison如果你想将这4个字节组合成一个整数,你需要执行以下操作:
int i= (rno[0]<<24)&0xff000000|
(rno[1]<<16)&0x00ff0000|
(rno[2]<< 8)&0x0000ff00|
(rno[3]<< 0)&0x000000ff;
我使用3个特殊运算符:|
是按位逻辑或,&
是逻辑与,<<
是左移。
实质上,我通过将字节就地移动并对它们进行OR运算来将4个8位字节组合成单个32位整数。
我还使用& 0xff
确保任何符号提升都不会影响结果。
Java中的原始数据类型(如byte)没有方法,但您可以直接执行以下操作:
int i=rno[0];
Byte
,而是Byte.intValue
。Byte
是一个类,而byte
是一种基本数据类型。 - MByD(b & 0xff)
将byte
转换为int
,而不是使用((int) b)
或等效的隐式转换int i = b;
,因为对于高位设置的字节,存在符号扩展的问题。忘记执行此操作是错误的常见来源。 - Luke Hutchisonint i= rno[0];
byte b = (byte)255;
int i = b &255;
int b = Byte.toUnsignedInt(a);
将a转换为无符号整数并赋值给b。
.intValue()
方法。前者是原始的字节值,可以像int i = rno[0]
这样进行赋值。 - wuppi