Je dois convertir un tableau de 2 octets (octet[2]) en valeur entière en Java. Comment puis-je le faire ?
Réponses
Trop de publicités?Vous pouvez utiliser ByteBuffer
pour ça :
ByteBuffer buffer = ByteBuffer.wrap(myArray);
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian
int result = buffer.getShort();
Voir aussi Convertir 4 octets en int .
En Java, les octets sont signés, ce qui signifie que la valeur d'un octet peut être négative, et lorsque cela se produit, la solution originale de @MattBall ne fonctionne pas.
Par exemple, si la forme binaire du tableau d'octets est la suivante :
1000 1101 1000 1101
alors mon tableau[0] est 1000 1101
et mon tableau[1] est 1000 1101
la valeur décimale de l'octet 1000 1101
es -115
au lieu de 141(= 2^7 + 2^3 + 2^2 + 2^0)
si nous utilisons
int result = (myArray[0] << 8) + myArray[1]
la valeur serait -16191
ce qui est FAUX.
La raison pour laquelle c'est faux est que lorsque nous interprétons un tableau de 2 octets en entier, tous les octets sont non signés, donc lors de la traduction, nous devons faire correspondre les octets signés à des entiers non signés :
((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)
le résultat est 36237
Utilisez une calculatrice ou un ByteBuffer pour vérifier si c'est correct (je l'ai fait, et oui, c'est correct).
Eh bien, chaque octet est un nombre entier compris entre -128 et 127, et il faut donc trouver un moyen de convertir une paire de nombres entiers en un seul nombre entier. Il existe de nombreuses façons de le faire, en fonction de ce que vous avez encodé dans la paire d'octets. La plus courante consiste à stocker un entier signé de 16 bits sous la forme d'une paire d'octets. Pour le reconvertir en un entier, il faut savoir si vous le stockez sous forme big-endian :
(byte_array[0]<<8) + (byte_array[1] & 0xff)
ou little endian :
(byte_array[1]<<8) + (byte_array[0] & 0xff)
- Réponses précédentes
- Plus de réponses