Подтвердить что ты не робот

Преобразование из байта в int в java

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

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

Но я получаю сообщение об ошибке:

 byte cannot be dereferenced
4b9b3361

Ответ 1

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

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

int i=rno[0];

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

Обратите внимание, что стандартное поведение преобразования byte 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;

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

Ответ 2

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

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

Ответ 3

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

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

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

В сущности, я объединять 4 8-битные байты в один 32-битный int, смещая байты на место и объединяя их вместе

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

Ответ 4

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

int i=rno[0];

Ответ 5

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

Просто скажите

int i= rno[0];

Ответ 6

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

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