Conversion de byte en int en java
J'ai généré un nombre aléatoire sécurisé, et mis sa valeur dans un octet. Voici mon code.
SecureRandom ranGen = new SecureRandom();
byte[] rno = new byte[4];
ranGen.nextBytes(rno);
int i = rno[0].intValue();
Mais je reçois une erreur:
byte cannot be dereferenced
6 réponses
Votre tableau est de byte
primitives, mais que vous essayez d'appeler une méthode sur eux.
Vous n'avez pas besoin de faire quelque chose explicite pour convertir un byte
pour un int
, il:
int i=rno[0];
...car il n'est pas abattu.
Juste pour être complet, #1: {Si vous[19]}ne voulez utiliser les différentes méthodes de Byte
pour une raison quelconque (vous n'avez pas besoin d'ici), vous pouvez utiliser un boxe conversion:
Byte b = rno[0]; // Boxing conversion converts `byte` to `Byte`
int i = b.intValue();
Ou le Byte
constructeur:
Byte b = new Byte(rno[0]);
int i = b.intValue();
Mais encore une fois, vous n'avez pas besoin de ça ici.
Juste pour être complet #2: Si était un downcast (par exemple, si vous essayiez de convertir un int
en un byte
), Tout ce dont vous avez besoin est un cast:
int i;
byte b;
i = 5;
b = (byte)i;
Cela garantit au compilateur que vous savez que c'est un downcast, donc vous n'obtenez pas l'erreur "possible loss of precision".
byte b = (byte)0xC8;
int v1 = b; // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)
La plupart du temps v2 est la façon dont vous avez vraiment besoin.
Si vous voulez combiner les 4 octets en un seul int, vous devez faire
int i= (rno[0]<<24)&0xff000000|
(rno[1]<<16)&0x00ff0000|
(rno[2]<< 8)&0x0000ff00|
(rno[3]<< 0)&0x000000ff;
J'utilise 3 opérateurs spéciaux |
est l'logiques bit à bit OU &
est le ET logique et <<
est le décalage à gauche
En substance, je combine les 4 octets de 8 bits en un seul int de 32 bits en déplaçant les octets en place et en les orant ensemble
Je m'assure également que toute promotion de signe n'affectera pas le résultat avec & 0xff
Les types de données primitifs (tels que byte) n'ont pas de méthodes en java, mais vous pouvez directement faire:
int i=rno[0];
Les octets sont convertis de manière transparente en ints.
Dis juste
int i= rno[0];