Ash*_*win 36 java type-conversion
我已生成一个安全的随机数,并将其值放入一个字节.这是我的代码.
SecureRandom ranGen = new SecureRandom();
byte[] rno = new byte[4];
ranGen.nextBytes(rno);
int i = rno[0].intValue();
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
byte cannot be dereferenced
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 70
你的数组是byte原始数组,但你试图在它们上调用一个方法.
你不需要做任何明确的转换byte到int,只是:
int i=rno[0];
Run Code Online (Sandbox Code Playgroud)
......因为它不是一个沮丧的人.
需要注意的是默认的行为byte-到- int转换是保留值的符号(记得byte是在Java中的符号类型).例如:
byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100
Run Code Online (Sandbox Code Playgroud)
如果您考虑的byte是无符号(156)而不是有符号(-100),要获得等效值,int您需要屏蔽符号位:
byte b2 = -100; // Or `= (byte)156;`
int i2 = (b2 & 0xFF);
System.out.println(i2); // 156
Run Code Online (Sandbox Code Playgroud)
只是为了完整性#1:如果你没有想用各种方法Byte由于某种原因(你不需要在这里),你可以使用一个装箱转换:
Byte b = rno[0]; // Boxing conversion converts `byte` to `Byte`
int i = b.intValue();
Run Code Online (Sandbox Code Playgroud)
或Byte构造函数:
Byte b = new Byte(rno[0]);
int i = b.intValue();
Run Code Online (Sandbox Code Playgroud)
但同样,你不需要这里.
只是为了完整性#2:如果它是一个向下的(例如,如果你试图将一个转换int为a byte),你需要的只是一个演员:
int i;
byte b;
i = 5;
b = (byte)i;
Run Code Online (Sandbox Code Playgroud)
这可以确保编译器知道它是一个向下转换,因此您不会得到"可能的精度损失"错误.
She*_*g.W 34
byte b = (byte)0xC8;
int v1 = b; // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)
Run Code Online (Sandbox Code Playgroud)
大部分时间v2是你真正需要的方式.
rat*_*eak 30
如果你想将4个字节组合成一个int,你需要做
int i= (rno[0]<<24)&0xff000000|
(rno[1]<<16)&0x00ff0000|
(rno[2]<< 8)&0x0000ff00|
(rno[3]<< 0)&0x000000ff;
Run Code Online (Sandbox Code Playgroud)
我使用3个特殊运算符|是按位逻辑OR &是逻辑AND并且<<是左移位
本质上,我将4个8位字节组合成一个32位int,方法是将字节移位到原位并将它们"或"在一起
我还确保任何标志促销都不会影响结果 & 0xff
原始数据类型(如byte)在java中没有方法,但您可以直接执行:
int i=rno[0];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
243211 次 |
| 最近记录: |