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
Votre tableau est composé de byte
primitives, mais vous essayez d’appeler une méthode dessus.
Vous n'avez pas besoin de faire quelque chose d'explicite pour convertir un byte
en un int
, il suffit de:
int i=rno[0];
... puisque ce n'est pas un abattage.
Notez que le comportement par défaut de byte
- à -int
conversion consiste à conserver le signe de la valeur (rappelez-vous que byte
est un type signé en Java). Ainsi par exemple:
byte b1 = -100;
int i1 = b1;
System.out.println(i1); // -100
Si vous pensiez que byte
était non signé (156) plutôt que signé (-100), pour obtenir la valeur équivalente dans int
, il vous faudrait masquer les bits de signe:
byte b2 = -100; // Or `= (byte)156;`
int i2 = (b2 & 0xFF);
System.out.println(i2); // 156
Juste pour compléter # 1: Si vous avez voulez utiliser les différentes méthodes de Byte
pour une raison quelconque ( vous n’avez pas besoin de ici ), vous pouvez utiliser un conversion de boxe :
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.
Par souci d’exhaustivité # 2: si cela étaient un downcast (par exemple, si vous essayiez de convertir un int
en un byte
, il vous suffit de un casting:
int i;
byte b;
i = 5;
b = (byte)i;
Cela garantit au compilateur que vous savez qu'il s'agit d'un downcast, de sorte que vous n'obtenez pas l'erreur "Possibilité de perte de précision".
byte b = (byte)0xC8;
int v1 = b; // v1 is -56 (0xFFFFFFC8)
int v2 = b & 0xFF // v2 is 200 (0x000000C8)
La plupart du temps, la v2 est ce dont vous avez vraiment besoin.
si vous voulez combiner les 4 octets en un seul int, vous devez le 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 la logique au niveau des bits OR &
est le ET logique et <<
est le décalage gauche
en substance, je combine les 4 octets de 8 bits en un seul entier de 32 bits en décalant les octets en place et en les plaçant 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 le
int i= rno[0];
Je pensais que ce serait:
byte b = (byte)255;
int i = b &255;