2012-03-06 71 views
25

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

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

但我得到一个错误:

byte cannot be dereferenced 
+1

* *什么错误你好吗? – 2012-03-06 10:11:23

+1

字节和字节之间有区别。后者是一个支持'.intValue()'方法的对象。第一个是原始字节值,只是将它赋值为'int i = rno [0];' – wuppi 2012-03-06 10:20:25

+0

另请参见http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int – DNA 2012-03-06 10:58:34

回答

57

你的数组是byte基元,但你试图调用它们的方法。

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

int i=rno[0]; 

...因为它不是一个垂头丧气。


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

这可以确保编译器知道这是一个低落的,所以你不会得到“可能的精度损失”错误。

+0

使用字节构造函数不是一个好主意。只要做'Byte b = rno [0];'而不是。 – xehpuk 2014-02-11 10:20:47

+0

@xehpuk:我应该提到拳击转换,现在就完成了。 – 2014-02-11 10:34:54

+0

在这种情况下,为什么拳击转换优于字节构造函数?根据我的理解,拳击转换最终以任何方式结束使用字节构造函数?我的理解是不正确的? – user3772575 2017-11-30 14:57:19

6

基本数据类型(如字节)没有在Java方法,但你可以直接做:

int i=rno[0]; 
+1

但有在java文档中称为byte.intValue()的函数 – Ashwin 2012-03-06 10:20:40

+6

不,它是Byte.intValue,Byte是类,byte是原始数据类型。 – MByD 2012-03-06 10:21:22

+0

明白了。谢谢 – Ashwin 2012-03-06 10:33:59

3

字节透明地转换为整数。

只是说

int i= rno[0]; 
+8

但是请注意,符号被保留下来,这并不总是你想要的(Java没有无符号字节) – DNA 2012-03-06 10:53:59

26

,如果你想在4个字节组合成一个单一的诠释,你需要做的

int i= (rno[0]<<24)&0xff000000| 
     (rno[1]<<16)&0x00ff0000| 
     (rno[2]<< 8)&0x0000ff00| 
     (rno[3]<< 0)&0x000000ff; 

我用3个特殊运营商|是按位逻辑或&是逻辑与和<<是左移

实质上,我将4个8位字节组合成一个单一的32位int sh ifting到位字节,或运算在一起

我也确保任何标志的推广不会& 0xff

+1

你在那里实际做了什么。你能解释一下这条线吗? – Ashwin 2012-03-06 10:35:15

+4

我会做(rno [0]&0x000000ff)<< 24 |(rno [1]&0x000000ff)<< 16 | ...等,这样我就可以使AND操作数保持不变。或者,你也可以做((int)rno [0])<< 24 |((int)rno [1])<< 16 | ...类型转换会自动将字节值放入原始int空间。 – ingyhere 2014-04-08 15:20:47

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

大部分时间V2的影响结果是你真正需要的方式。

+0

这是因为32位机器生成长0xffffffc8,谢谢。 – herbertD 2017-12-17 16:23:43

2

我认为这将是:

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