安全な乱数を生成し、その値をバイトに入れました。これが私のコードです。
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
- to -int
変換のデフォルトの動作は、値の符号を保持することです(byte
はJavaの符号付き型であることを思い出してください)。したがって、たとえば:
byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100
byte
を符号付き(-100)ではなく符号なし(156)と考えている場合、int
で同等の値を取得するには、符号ビットをマスクする必要があります。
byte b2 = -100; // Or `= (byte)156;`
int i2 = (b2 & 0xFF);
System.out.println(i2); // 156
完全を期すために1:何らかの理由でdidがさまざまな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();
しかし、ここでもそれは必要ありません。
完全を期すために#2:downcastであった場合(たとえば、int
をbyte
に変換しようとしていた場合)、必要なものすべてキャストです:
int i;
byte b;
i = 5;
b = (byte)i;
これにより、コンパイラーがダウンキャストであることを確認できるため、「精度の低下の可能性」エラーが発生しません。
byte b = (byte)0xC8;
int v1 = b; // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)
ほとんどの場合、v2は本当に必要な方法です。
4バイトを1つのintに結合する場合は、行う必要があります
int i= (rno[0]<<24)&0xff000000|
(rno[1]<<16)&0x00ff0000|
(rno[2]<< 8)&0x0000ff00|
(rno[3]<< 0)&0x000000ff;
3つの特別な演算子を使用します|
はビット単位の論理OR &
は論理AND、<<
は左シフト
基本的に、バイトを所定の位置にシフトし、それらをORすることにより、4つの8ビットバイトを単一の32ビットintに結合します。
また、& 0xff
を使用して、サインのプロモーションが結果に影響しないようにします
プリミティブデータ型(バイトなど)にはJavaのメソッドはありませんが、直接実行できます:
int i=rno[0];
バイトは透過的にintに変換されます。
言うだけ
int i= rno[0];
私はそれだろうと思った:
byte b = (byte)255;
int i = b &255;