99 votes

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 effectue l'opération de conversion ci-dessus.

5 votes

Qu'entendez-vous par "valeur numérique" ? Les octets représentent-ils un nombre entier (long) ou à virgule flottante (double) en binaire ? Sont-ils la représentation en chaîne d'un nombre ? Ou encore une autre représentation ?

1 votes

0 votes

NB : Le lien de TacB0sS était ce que je cherchais en fait - la conversion en avant et en arrière.

124voto

coobird Points 70356

On pourrait utiliser le Buffer qui sont fournis dans le cadre de l java.nio pour effectuer la conversion.

Ici, la source byte[] Le tableau a une longueur de 8, qui est la taille qui correspond à un long valeur.

Tout d'abord, le byte[] est enveloppé dans un ByteBuffer et ensuite le [ByteBuffer.getLong](http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#getLong()) est appelée pour obtenir le long valeur :

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

J'aimerais remercier dfa d'avoir signalé la ByteBuffer.getLong dans les commentaires.


Bien que cela puisse ne pas être applicable dans cette situation, la beauté de la Buffer sont liées à l'examen d'un tableau à valeurs multiples.

Par exemple, si nous avions un tableau de 8 octets, et que nous voulions le voir comme deux int nous pourrions envelopper les valeurs byte[] dans un tableau 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

0 votes

Qu'en est-il de ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4}).getLong() ? Cette méthode devrait lire les 8 octets suivants et les convertir en un long.

0 votes

@dfa : Merci de l'avoir signalé, cela semble fonctionner - je vais modifier la réponse :)

114voto

Mnementh Points 19831

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);
}

Si 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);
}

Remplacer long par BigInteger si vous avez plus de 8 octets.

Merci à Aaron Digulla pour la correction de mes erreurs.

8 votes

-1 octets sont des valeurs signées ! Et remplacez pow() par shift (<<) ! "valeur = (valeur << 8) + (by[i] & 0xff)"

0 votes

L'opérateur de décalage (<<) a-t-il une préséance de droite à gauche ? Comment fonctionne le code ci-dessus ? Il fonctionne très bien pour moi. Je veux juste savoir comment ça marche. Thanx à l'avance

0 votes

@Mnementh : L'opérateur de décalage (<<) a-t-il une préséance de droite à gauche ? Comment fonctionne le code ci-dessus ? Il fonctionne très bien pour moi. Je veux juste savoir comment ça marche. Merci d'avance

17voto

Vincent Robert Points 16530

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 String(byteArray, "UTF-8"));

0 votes

J'aurais voté pour cette réponse si elle s'était terminée juste après le premier extrait de code, ou si elle avait inclus du code pour convertir la chaîne en "valeur numérique". En l'état, la seconde moitié de votre réponse semble être un non sequitur.

0 votes

Ce n'est pas ce que je voulais dire en premier lieu, j'ai changé ma réponse.

17voto

Chen Yi Points 71

Simplement, vous pourriez utiliser ou faire référence à goyave lib fourni par google, qui offre des méthodes utilitaires pour la conversion entre les tableaux longs et les tableaux d'octets. Mon code client :

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

9voto

Jamel Toms Points 944

Vous pouvez également utiliser BigInteger pour les octets de longueur variable. Vous pouvez le convertir en Long, Integer ou Short, selon ce qui vous convient.

new BigInteger(bytes).intValue();

ou pour indiquer la polarité :

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

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