Mam tablicę 8-bajtową i chcę przekonwertować ją na odpowiednią wartość liczbową.
na przykład
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
Chcę metody, która wykona powyższą operację konwersji.
new BigInteger(by).longValue()
Odpowiedzi:
Zakładając, że pierwszy bajt jest najmniej znaczącym bajtem:
long value = 0; for (int i = 0; i < by.length; i++) { value += ((long) by[i] & 0xffL) << (8 * i); }
Czy pierwszy bajt jest najbardziej znaczący, to jest trochę inny:
long value = 0; for (int i = 0; i < by.length; i++) { value = (value << 8) + (by[i] & 0xff); }
Zamień long na BigInteger , jeśli masz więcej niż 8 bajtów.
Podziękowania dla Aarona Digulla za poprawienie moich błędów.
źródło
value += ((long)by[i] & 0xffL) << (8 * i);
Aby wykonać konwersję, można użyć
Buffer
s, które są dostarczane jako częśćjava.nio
pakietu.W tym przypadku
byte[]
tablica źródłowa ma długość 8, czyli rozmiar odpowiadającylong
wartości.Najpierw
byte[]
tablica jest zawijana aByteBuffer
, a następnieByteBuffer.getLong
wywoływana jest metoda w celu uzyskanialong
wartości:ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4}); long l = bb.getLong(); System.out.println(l);
Wynik
4
Chciałbym podziękować dfa za wskazanie
ByteBuffer.getLong
metody w komentarzach.Chociaż może to nie mieć zastosowania w tej sytuacji, piękno tych funkcji
Buffer
polega na spojrzeniu na tablicę z wieloma wartościami.Na przykład, gdybyśmy mieli 8-bajtową tablicę i chcielibyśmy zobaczyć ją jako dwie
int
wartości, moglibyśmy zawinąćbyte[]
tablicę w anByteBuffer
, która jest wyświetlana jako aIntBuffer
i uzyskać wartości przezIntBuffer.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);
Wynik:
1 4
źródło
Jeśli jest to 8-bajtowa wartość liczbowa, możesz spróbować:
BigInteger n = new BigInteger(byteArray);
Jeśli jest to bufor znaków UTF-8, możesz spróbować:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
źródło
Po prostu możesz użyć lub odwołać się do guava lib dostarczonego przez Google, który oferuje przydatne metody konwersji między tablicą długą i bajtową. Mój kod klienta:
long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte));
źródło
Możesz również użyć BigInteger dla bajtów o zmiennej długości. Możesz przekonwertować go na długi, całkowity lub krótki, w zależności od potrzeb.
new BigInteger(bytes).intValue();
lub do oznaczenia biegunowości:
new BigInteger(1, bytes).intValue();
źródło
Kompletny kod konwertera Java dla wszystkich typów pierwotnych do / z tablic http://www.daniweb.com/code/snippet216874.html
źródło
Każda komórka w tablicy jest traktowana jako int bez znaku:
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; }
źródło