Merci pour l'explication, j'avais zappé la conversion en integer...
J'ai toutefois une autre question: J'essaie d'utiliser des unsigned integer, du coup, mon raisonnement est le suivant.
1 2 3 4 5 6 7 8 9 10 11 12
| //Je lis des données équivalent à un unsigned int (32 bits), dans l'exemple je l'ai codé en dur
byte[] bytes = {(byte) 0xE0,(byte) 0x3A,(byte) 0xEC,0x02};
// Mes bytes sont en big-endian, du coup, pour récupérer la valeur, je fais comme ça:
int value = (((bytes[0] & 0xff) << 24) | ((bytes[1] & 0xff) << 16) |
((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff));
//Jusque là tout ce passe bien. Mais ma variable "value" étant un integer (32 bits) signé, si je tente d'afficher la valeur, j'obtiens un nombre négatif (normal vu que mon nombre est grand et que le MSB est à 1).
System.out.println(value); // -533009406 (en binaire: 11100000001110101110110000000010) |
Mon idée est de convertir mon "value" dans un type plus grand ("long" de 64bits) et d'enlever les bits mis à 1 qui font de lui un nombre négatif.
En gros, mon "value" vaut : 11100000001110101110110000000010
Une fois passer en "long", il devrait valoir: 11111111111111111111111111111111 11100000001110101110110000000010
Je devrais pouvoir extraire la valeur positive grâce à "&0xFFFFFFFF".
1 2
|
System.out.println(((long)value)&0xFFFFFFFF); //Renvoie toujours un nombre négatif... |
Pourquoi est-ce que j'ai toujours un nombre négatif? La fonction d'affichage (System.out.println()) supporte les long et ne fait pas de conversion implicite en integer pourtant... Je devrais obtenir 3761957890, non?
Merci encore une fois pour votre aide

Partager