在java中从byte转换为int

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原始数组,但你试图在它们上调用一个方法.

你不需要做任何明确的转换byteint,只是:

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是你真正需要的方式.

  • 这是正确的答案,v2 几乎总是你想要的。在没有 `& 0xff` 的情况下将字节隐式转换为 int 是 Java 中的错误来源。 (2认同)

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

  • 我会做(rno [0]&0x000000ff)<< 24 |(rno [1]&0x000000ff)<< 16 | ...等等,所以我可以使该AND运算符成为常数.或者,你也可以做((int)rno [0])<< 24 |((int)rno [1])<< 16 | ...因为类型转换会自动将字节值放入原始int空间. (4认同)

MBy*_*ByD 6

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

int i=rno[0];
Run Code Online (Sandbox Code Playgroud)

  • 不,它是`Byte.intValue`,而`Byte`是一个类,`byte`是原始数据类型. (6认同)