Frage

Ich habe einen 8-Byte-Array und ich mag es seinen entsprechenden numerischen Wert konvertieren.

z.

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

// CONVERSION OPERATION
// return the numeric value

Ich möchte eine Methode, die die obige Umwandlungsoperation wird durchzuführen.

War es hilfreich?

Lösung

Unter der Annahme, das erste Byte ist das am wenigsten signifikante Byte:

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

Ist das erste Byte der bedeutendste, dann ist es ein bisschen anders:

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

Ersetzen lange mit BigInteger , wenn Sie haben mehr als 8 Byte.

Dank Aaron Digulla für die Korrektur meiner Fehler.

Andere Tipps

Man könnte verwenden die Buffer s , die als Teil der java.nio Paket, um die Konvertierung durchführen.

Hier weist die Quelle byte[] Array eine Länge von 8, die die Größe ist, die mit einem long Wert entspricht.

Zuerst wird die byte[] Array wird in einem ByteBuffer , und dann wird der ByteBuffer.getLong Methode wird aufgerufen, den long Wert zu erhalten:

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

System.out.println(l);

Ergebnis

4

Ich möchte DFA danken für die ByteBuffer.getLong Methode in den Kommentaren darauf hingewiesen.


Auch wenn es nicht in dieser Situation anwendbar sein kann, die Schönheit der Buffers kommt mit Blick auf einem Array mit mehreren Werten.

Zum Beispiel, wenn wir eine 8-Byte-Array haben, und wollten wir es als zwei int Werte betrachten, könnten wir den byte[] Array in einem ByteBuffer wickeln, die als IntBuffer und die Werte von 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);

Ergebnis:

1
4

Wenn dies ein 8-Byte numerischer Wert, können Sie versuchen:

BigInteger n = new BigInteger(byteArray);

Wenn dies ein UTF-8-Zeichenpuffer, dann können Sie versuchen:

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

Einfach, könnten Sie oder finden Sie unter Guave lib von Google zur Verfügung gestellt, die für die Konvertierung zwischen langen und Byte-Array utiliy Methoden bieten. Mein Client-Code:

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

Sie können auch BigInteger für variable Länge Bytes verwenden. Sie können es konvertieren Long, Integer oder Short, je nachdem, was Ihren Bedürfnissen entspricht.

new BigInteger(bytes).intValue();

oder Polarität bezeichnen:

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

Komplette Java-Konverter-Code für alle primitiven Typen zu / von Arrays http://www.daniweb.com/code/snippet216874.html

Jede Zelle in dem Array wird als unsigned int behandelt:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top