Comment convertir un tableau d’octets en sa valeur numérique (Java)?

J’ai un tableau de 8 octets et je veux le convertir en sa valeur numérique correspondante.

par exemple

byte[] by = new byte[8]; // the byte array is stored in 'by' // CONVERSION OPERATION // return the numeric value 

Je veux une méthode qui effectuera l’opération de conversion ci-dessus.

En supposant que le premier octet est l’octet le moins significatif:

 long value = 0; for (int i = 0; i < by.length; i++) { value += ((long) by[i] & 0xffL) << (8 * i); } 

Est-ce que le premier octet est le plus significatif, alors c'est un peu différent:

 long value = 0; for (int i = 0; i < by.length; i++) { value = (value << 8) + (by[i] & 0xff); } 

Remplacez longtemps par BigInteger , si vous avez plus de 8 octets.

Merci à Aaron Digulla pour la correction de mes erreurs.

On pourrait utiliser les Buffer fournis dans le package java.nio pour effectuer la conversion.

Ici, le tableau d’ byte[] source byte[] a une longueur de 8, qui correspond à une valeur long .

Tout d’abord, le tableau byte[] est ByteBuffer dans un ByteBuffer , puis la méthode ByteBuffer.getLong est appelée pour obtenir la valeur long :

 ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4}); long l = bb.getLong(); System.out.println(l); 

Résultat

 4 

Je tiens à remercier DFA pour avoir souligné la méthode ByteBuffer.getLong dans les commentaires.


Bien que cela ne soit pas applicable dans cette situation, la beauté des Buffer réside dans le fait de regarder un tableau avec plusieurs valeurs.

Par exemple, si nous avions un tableau de 8 octets et que nous voulions le voir comme deux valeurs int , nous pourrions envelopper le tableau d’ byte[] dans un ByteBuffer , qui est considéré comme un IntBuffer et obtenir les valeurs par IntBuffer.get :

 ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4}); IntBuffer ib = bb.asIntBuffer(); int i0 = ib.get(0); int i1 = ib.get(1); System.out.println(i0); System.out.println(i1); 

Résultat:

 1 4 

S’il s’agit d’une valeur numérique de 8 octets, vous pouvez essayer:

 BigInteger n = new BigInteger(byteArray); 

S’il s’agit d’un tampon de caractères UTF-8, vous pouvez essayer:

 BigInteger n = new BigInteger(new Ssortingng(byteArray, "UTF-8")); 

Simplement, vous pouvez utiliser ou faire référence à la librairie guava fournie par google, qui propose des méthodes utiles pour la conversion entre les tableaux longs et les octets. Mon code client:

  long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte)); 

Vous pouvez également utiliser BigInteger pour les octets de longueur variable. Vous pouvez le convertir en long, entier ou court, selon vos besoins.

 new BigInteger(bytes).intValue(); 

ou pour dénoter la polarité:

 new BigInteger(1, bytes).intValue(); 

Code complet du convertisseur Java pour tous les types primitifs vers / depuis les tableaux http://www.daniweb.com/code/snippet216874.html

Chaque cellule du tableau est traitée comme unsigned int:

 private int unsignedIntFromByteArray(byte[] bytes) { int res = 0; if (bytes == null) return res; for (int i=0;i