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
28
demandé sur nbro 2012-03-06 14:10:21

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".

61
répondu T.J. Crowder 2014-02-11 10:34:37
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.

29
répondu Sheng.W 2015-09-08 08:29:47

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

28
répondu ratchet freak 2014-04-23 13:53:45

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];
6
répondu MByD 2012-03-06 10:12:19

Les octets sont convertis de manière transparente en ints.

Dis juste

int i= rno[0];
3
répondu Saintali 2012-03-06 10:14:19

Je pensais que ce serait:

byte b = (byte)255;
int i = b &255;
2
répondu joe 2016-05-10 22:00:07