Conversion d’octet 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 

    Votre tableau est constitué de primitives d’ byte , mais vous essayez d’y appeler une méthode.

    Vous n’avez pas besoin de faire quelque chose d’explicite pour convertir un byte en int , mais simplement:

     int i=rno[0]; 

    … puisque ce n’est pas une chute.


    Juste pour être complet # 1: Si vous vouliez utiliser les différentes méthodes de Byte pour une raison quelconque ( vous n’avez pas besoin de le faire ici ), vous pourriez utiliser une conversion de boxe :

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

    Ou le constructeur Byte :

     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 c’était un downcast (par exemple, si vous essayiez de convertir un int en un byte ), tout ce dont vous avez besoin est 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, 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 le OU logique au niveau des bits & 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 l’octet) n’ont pas de méthode en Java, mais vous pouvez le faire directement:

     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;