Omzetten van byte naar int in java

Ik heb een veilig willekeurig getal gegenereerd en de waarde ervan in een byte gezet. Hier is mijn code.

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

Maar ik krijg een foutmelding:

byte cannot be dereferenced

Antwoord 1, autoriteit 100%

Je array bestaat uit byteprimitieven, maar je probeert er een methode op aan te roepen.

U hoeft niets expliciets te doen om een bytenaar een intte converteren, alleen:

int i=rno[0];

…omdat het geen neerslachtigheid is.

Merk op dat het standaardgedrag van byte-naar-intconversie is om het teken van de waarde te behouden (onthoud dat byteeen ondertekend typ java). Dus bijvoorbeeld:

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

Als je dacht aan de byteals niet-ondertekend (156) in plaats van ondertekend (-100), is er vanaf Java 8 Byte.toUnsignedInt:

byte b2 = -100; // Or `= (byte)156;`
int = Byte.toUnsignedInt(b2);
System.out.println(i2); // 156

Vóór Java 8, om de equivalente waarde in de intte krijgen, moet u de tekenbits maskeren:

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

Voor de volledigheid #1: als u welde verschillende methoden van byteom de een of andere reden wilt gebruiken (u hoeft hier niet), kunt u een boksconversie:

Byte b = rno[0]; // Boxing conversion converts `byte` to `Byte`
int i = b.intValue();

Of de byte-constructor:

Byte b = new Byte(rno[0]);
int i = b.intValue();

Maar nogmaals, dat heb je hier niet nodig.


Voor de volledigheid #2: als het waseen neerslachtigheid (bijv. als je een intprobeerde te converteren naar een byte) , alles wat je nodig hebt is een cast:

int i;
byte b;
i = 5;
b = (byte)i;

Dit verzekert de compiler dat u weet dat het een downcast is, zodat u niet de foutmelding “Mogelijk verlies van precisie” krijgt.


Antwoord 2, autoriteit 49%

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

Meestal is v2 de manier die je echt nodig hebt.


Antwoord 3, autoriteit 36%

als je de 4 bytes wilt combineren tot een enkele int, moet je dat doen

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

Ik gebruik 3 speciale operators |is de bitwise logische of &is de logische en <<is de linkerverschuiving

In essentie combineer ik de 4 8-bits bytes in een enkele 32-bit int door de bytes op zijn plaats te verschuiven en ze samen te schakelen

Ik zorg ook voor een tekenpromotie heeft geen invloed op het resultaat met & 0xff


Antwoord 4, Autoriteit 7%

Primitieve gegevenstypen (zoals byte) hebben geen methoden in Java, maar u kunt het direct doen:

int i=rno[0];

Antwoord 5, Autoriteit 4%

Bytes worden transparant geconverteerd naar ints.

Zeg gewoon

int i=rno[0];

Antwoord 6, Autoriteit 3%

Ik dacht dat het zou zijn:

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

Other episodes