Come convertire un array di byte nel suo valore numerico (Java)?


91

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

per esempio

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

// CONVERSION OPERATION
// return the numeric value

Voglio un metodo che esegua l'operazione di conversione sopra.


4
Cosa intendi per "valore numerico"? I byte rappresentano un numero intero (lungo) o in virgola mobile (doppio) in binario? Sono la rappresentazione di stringa di un numero? O ancora un'altra rappresentazione?
starblue


NB: il link di TacB0sS era quello che stavo effettivamente cercando, sia la conversione in avanti che quella all'indietro.
Jay Taylor

new BigInteger(by).longValue()
user207421

Risposte:


108

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 è leggermente diverso:

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

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

Grazie ad Aaron Digulla per la correzione dei miei errori.


8
-1 byte sono valori con segno! E sostituisci pow () con shift (<<)! "value = (value << 8) + (by [i] & 0xff)"
Aaron Digulla,

L'operatore di spostamento (<<) ha la precedenza da destra a sinistra? Come funziona il codice sopra? Funziona bene per me. Voglio solo sapere come funziona. Grazie in anticipo
suraj

@ Mnementh: L'operatore di spostamento (<<) ha la precedenza da destra a sinistra? Come funziona il codice sopra? Funziona tutto bene per me. Voglio solo sapere come funziona. Grazie in anticipo
suraj

5
Nel caso in cui qualcun altro abbia lo stesso problema che ho fatto io, nel primo esempio, da [i] deve essere eseguito il cast a long, altrimenti funziona solo per valori inferiori a 2 ^ 32. Cioè,value += ((long)by[i] & 0xffL) << (8 * i);
Luca

115

Si potrebbero usare i messaggi di posta Bufferelettronica forniti come parte dijava.nio pacchetto per eseguire la conversione.

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

Innanzitutto, l' byte[]array è racchiuso in un ByteBuffer, quindi il ByteBuffer.getLongmetodo viene chiamato per ottenere il longvalore:

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 ByteBuffer.getLongmetodo nei commenti.


Sebbene possa non essere applicabile in questa situazione, il bello degli Buffers viene dall'osservare un array con più valori.

Ad esempio, se avessimo un array di 8 byte e volessimo visualizzarlo come due intvalori, potremmo racchiudere l' byte[]array in un ByteBuffer, che viene visualizzato come a IntBuffere ottenere i valori da 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

che dire di ByteBuffer.wrap (nuovo byte [] {0, 0, 0, 1, 0, 0, 0, 4}). getLong ()? questo metodo dovrebbe leggere i successivi 8 byte e convertirli in un long
dfa

@dfa: Grazie per averlo sottolineato, sembra che funzioni sicuramente - modifico la risposta. :)
coobird

16

Se questo è un valore numerico di 8 byte, puoi provare:

BigInteger n = new BigInteger(byteArray);

Se questo è un buffer di caratteri UTF-8, puoi provare:

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

Avrei votato per questa risposta se finisse subito dopo il primo snippet di codice, o se includesse del codice per convertire la stringa in un "valore numerico". Così com'è, la seconda metà della tua risposta sembra un non sequitur.
Laurence Gonsalves,

Non è quello che volevo dire in primo luogo, ho cambiato la mia risposta
Vincent Robert,


9

È inoltre possibile utilizzare BigInteger per byte di lunghezza variabile. Puoi convertirlo in Lungo, Intero o Corto, a seconda delle tue esigenze.

new BigInteger(bytes).intValue();

o per indicare la polarità:

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


1

Ogni cella nell'array viene trattata come 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;
}

Solo una nota che dovevo usare 0xFFL, altrimenti il ​​cast da int 0xFF a long aveva un sacco di bit 1 errati impostati quando ho stampato Long.toHexString (l).
Luca

Devi usare 0xFFL altrimenti ottieni l'estensione del segno.
Gray

0
public static long byteArrayToLong(byte[] bytes) {
    return ((long) (bytes[0]) << 56)
            + (((long) bytes[1] & 0xFF) << 48)
            + ((long) (bytes[2] & 0xFF) << 40)
            + ((long) (bytes[3] & 0xFF) << 32)
            + ((long) (bytes[4] & 0xFF) << 24)
            + ((bytes[5] & 0xFF) << 16)
            + ((bytes[6] & 0xFF) << 8)
            + (bytes[7] & 0xFF);
}

convertire l'array di byte (long è 8 byte) in long

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.