Question

J'ai un tableau de 8 octets et je veux le convertir en 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 souhaite une méthode permettant d'effectuer l'opération de conversion ci-dessus.

Était-ce utile?

La solution

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

Le premier octet est-il le plus significatif, alors il 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.

Autres conseils

On pourrait utiliser le tampon qui sont fournis dans le cadre du java.nio pour effectuer la conversion.

Ici, le tableau source octet [] a une longueur de 8, soit la taille correspondant à une valeur long .

Premièrement, le tableau byte [] est encapsulé dans un ByteBuffer , puis le 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 voudrais remercier dfa pour avoir signalé la méthode ByteBuffer.getLong dans les commentaires.

Bien que cela ne soit peut-être pas applicable dans cette situation, la beauté des Buffer vient en regardant un tableau avec plusieurs valeurs.

Par exemple, si nous avions un tableau de 8 octets et que nous voulions l'afficher sous forme de deux valeurs int , nous pourrions envelopper le tableau octet [] dans un < code> ByteBuffer , qui est considéré comme un IntBuffer et obtenez 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 String(byteArray, "UTF-8"));

Vous pouvez simplement utiliser ou consulter la guava lib fournie par Google, qui offre des méthodes utiles pour la conversion entre un tableau long et un tableau d'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 indiquer la polarité:

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

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

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

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


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top