Domanda

Ho un array di 8 byte e voglio convertirlo nel suo valore numerico corrispondente.

per es.

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

Voglio un metodo che eseguirà l'operazione di conversione sopra.

È stato utile?

Soluzione

Supponendo che il primo byte sia il byte meno significativo:

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

Il primo byte è il più significativo, quindi è un po 'diverso:

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

Sostituisci a lungo con BigInteger , se hai più di 8 byte.

Grazie ad Aaron Digulla per la correzione dei miei errori.

Altri suggerimenti

Si potrebbe usare il Buffer fornito in java.nio pacchetto per eseguire la conversione.

Qui, l'array di origine byte [] ha una lunghezza di 8, che è la dimensione che corrisponde a un valore long .

Innanzitutto, l'array byte [] è racchiuso in un ByteBuffer , quindi Il metodo ByteBuffer.getLong viene chiamato per ottenere il valore long :

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

System.out.println(l);

Risultato

4

Vorrei ringraziare dfa per aver sottolineato il metodo ByteBuffer.getLong nei commenti.


Anche se potrebbe non essere applicabile in questa situazione, la bellezza del Buffer arriva nel guardare un array con più valori.

Ad esempio, se avessimo un array da 8 byte e volessimo vederlo come due valori int , potremmo avvolgere l'array byte [] in un < code> ByteBuffer , che viene visualizzato come IntBuffer e ottenere i valori di 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);

Risultato:

1
4

Se si tratta di un valore numerico di 8 byte, puoi provare:

BigInteger n = new BigInteger(byteArray);

Se si tratta di un buffer di caratteri UTF-8, puoi provare:

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

Semplicemente, puoi usare o fare riferimento alla guava lib fornita da google, che offre metodi utili per la conversione tra array long e byte. Il mio codice cliente:

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

Puoi anche usare BigInteger per byte di lunghezza variabile. Puoi convertirlo in Long, Integer o Short, a seconda delle tue esigenze.

new BigInteger(bytes).intValue();

o per indicare la polarità:

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

Codice convertitore Java completo per tutti i tipi primitivi verso / dagli array http://www.daniweb.com/code/snippet216874.html

Ogni cella dell'array viene considerata come non firmata 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top