web-dev-qa-db-fra.com

Conversion d'octet en int 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
35
Ashwin

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

68
T.J. Crowder
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.

34
Sheng.W

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

30
ratchet freak

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
MByD

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

Dis le

int i= rno[0];
3
Saintali

Je pensais que ce serait:

byte b = (byte)255;
int i = b &255;
2
joe