Wie ein Byte-Array zu seinem numerischen Wert (Java) konvertieren?
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.
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 Buffer
s 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;
}