Преобразование из байта в int в Java - PullRequest
34 голосов
/ 06 марта 2012

Я сгенерировал безопасное случайное число и поместил его значение в байт.Вот мой код.

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

Но я получаю ошибку:

 byte cannot be dereferenced

Ответы [ 6 ]

67 голосов
/ 06 марта 2012

Ваш массив состоит из byte примитивов, но вы пытаетесь вызвать метод для них.

Вам не нужно ничего делать явным образом для преобразования byte в int, просто:

int i=rno[0];

... так как это не уныние.

Обратите внимание, что стандартное поведение преобразования byte -to- int заключается в сохранении знаказначение (помните, byte является типом со знаком в Java).Например:

byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100

Если вы думаете о byte как о беззнаковом (156), а не как о подписи (-100), чтобы получить эквивалентное значение в int, вам нужнозамаскируйте биты знака:

byte b2 = -100; // Or `= (byte)156;`
int i2 = (b2 & 0xFF);
System.out.println(i2); // 156

Только для полноты № 1: Если вы хотите использовать различные методы 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: Если бы было удручением (например, если вы пыталисьчтобы преобразовать int в byte), все, что вам нужно, - это приведение:

int i;
byte b;

i = 5;
b = (byte)i;

Это гарантирует компилятору, что вы знаете, что он унылый, поэтому вы не получите "Возможные потериточности "ошибка.

34 голосов
/ 08 сентября 2015
byte b = (byte)0xC8;
int v1 = b;       // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)

В большинстве случаев v2 - это то, что вам действительно нужно.

30 голосов
/ 06 марта 2012

, если вы хотите объединить 4 байта в одно целое, вам нужно сделать

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

Я использую 3 специальных оператора | - это побитовое логическое ИЛИ & - это логическое И, а << - это левый сдвиг

по сути, я объединяю 4 8-битных байта в один 32-битный int, сдвигая байты на месте и объединяя их в единое целое

Я также гарантирую, что любое продвижение знака не повлияет на результат с & 0xff

6 голосов
/ 06 марта 2012

Примитивные типы данных (например, байты) не имеют методов в java, но вы можете сделать это напрямую:

int i=rno[0];
3 голосов
/ 06 марта 2012

Байты прозрачно преобразуются в целые.

Просто скажи

int i= rno[0];
2 голосов
/ 11 мая 2016

Я думал, что это будет:

byte b = (byte)255;
int i = b &255;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...