16 votes

Java : Convertir un octet en un nombre entier

Je dois convertir un tableau de 2 octets (octet[2]) en valeur entière en Java. Comment puis-je le faire ?

26voto

Matt Ball Points 165937

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 .

11voto

DiveInto Points 599

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

3voto

Chris Dodd Points 39013

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)

3voto

Nacho Coloma Points 930

Aussi, si vous pouvez utiliser la bibliothèque Guava :

Ints.fromByteArray(0, 0, myArray[1], myArray[0]);

Cela valait la peine d'être mentionné car de nombreux projets l'utilisent de toute façon.

3voto

Droid Chris Points 122

Faites simplement ceci :

return new BigInteger(byte[] yourByteArray).intValue();

Fonctionne très bien sur les conversions de commandes Bluetooth, etc. Il n'est pas nécessaire de s'inquiéter de la conversion signé/non signé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X