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 byte
primitieven, maar je probeert er een methode op aan te roepen.
U hoeft niets expliciets te doen om een byte
naar een int
te converteren, alleen:
int i=rno[0];
…omdat het geen neerslachtigheid is.
Merk op dat het standaardgedrag van byte
-naar-int
conversie is om het teken van de waarde te behouden (onthoud dat byte
een ondertekend typ java). Dus bijvoorbeeld:
byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100
Als je dacht aan de byte
als 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 int
te 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 byte
om 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 int
probeerde 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;