web-dev-qa-db-ja.com

javaのbyteからintへの変換

安全な乱数を生成し、その値をバイトに入れました。これが私のコードです。

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

しかし、私はエラーが発生しています:

 byte cannot be dereferenced
35
Ashwin

配列はbyteプリミティブですが、それらのメソッドを呼び出そうとしています。

byteintに変換するために明示的な操作を行う必要はありません。

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であった場合(たとえば、intbyteに変換しようとしていた場合)、必要なものすべてキャストです:

int i;
byte b;

i = 5;
b = (byte)i;

これにより、コンパイラーがダウンキャストであることを確認できるため、「精度の低下の可能性」エラーが発生しません。

68
T.J. Crowder
byte b = (byte)0xC8;
int v1 = b;       // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)

ほとんどの場合、v2は本当に必要な方法です。

34
Sheng.W

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を使用して、サインのプロモーションが結果に影響しないようにします

30
ratchet freak

プリミティブデータ型(バイトなど)にはJavaのメソッドはありませんが、直接実行できます:

int i=rno[0];
6
MByD

バイトは透過的にintに変換されます。

言うだけ

int i= rno[0];
3
Saintali

私はそれだろうと思った:

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