web-dev-qa-db-fra.com

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

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 veux une méthode qui effectuera l'opération de conversion ci-dessus.

84
pirate

En supposant que le premier octet soit 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 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 long par BigInteger , si vous avez plus de 8 octets.

Merci à Aaron Digulla pour la correction de mes erreurs.

101
Mnementh

On pourrait utiliser les Buffer s fournis dans le cadre du Java.nio package pour effectuer la conversion.

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

Premièrement le byte[] Le tableau est entouré d’un ByteBuffer , puis du ByteBuffer.getLong la méthode 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 d’avoir signalé le ByteBuffer.getLong méthode dans les commentaires.


Bien que cela ne soit peut-être pas applicable dans cette situation, la beauté de Buffers vient en regardant 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 byte[] tableau dans un ByteBuffer, visualisé sous la forme 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
111
coobird

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"));
16
Vincent Robert

Simplement, vous pouvez utiliser ou vous référer à guava lib fourni par Google, qui offre des méthodes utilitaires pour la conversion entre les tableaux long et octets. Mon code client:

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

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ésigner la polarité:

new BigInteger(1, bytes).intValue();
8
Jamel Toms

Terminez Java pour tous les types primitifs vers/à partir de tableaux http://www.daniweb.com/code/snippet216874.html

3
iBog

Chaque cellule du tableau est traitée comme un non signé:

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;
}
1
Asaf Pinhassi