2010-12-20 19 views
15

Potrzebuję przekonwertować tablicę 2-bajtową (bajt [2]) na wartość całkowitą w java. Jak mogę to zrobić?Java: Konwertuj bajt na liczbę całkowitą

+5

To pytanie może wymagać pewnych wyjaśnień. W tej chwili zobaczymy tylko, co masz na myśli, wybierając odpowiedź. –

Odpowiedz

24

Można użyć ByteBuffer na to:

ByteBuffer buffer = ByteBuffer.wrap(myArray); 
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian 
int result = buffer.getShort(); 

Zobacz także Convert 4 bytes to int.

+5

+1 za rozwiązanie ByteBuffer – Casey

+0

Dziękuję, że to zadziałało. Czy ByteBuffer zajmie się podpisanymi i niepodpisanymi bajtami? – keshav

+0

@keshav: co masz na myśli? Nie ma czegoś takiego jak bajt "podpisany" lub "niepodpisany". Bajt to po prostu grupa "0" i "1"; znaczenie ** ma wpływ na interpretację tych liczb. –

3

Cóż, każdy bajt jest liczbą całkowitą z zakresu -128..127, więc potrzebny jest sposób odwzorowania pary liczb całkowitych na jedną liczbę całkowitą. Jest wiele sposobów na to, w zależności od tego, co zakodowałeś w parze bajtów. Najczęstszym będzie przechowywanie 16-bitowej liczby całkowitej ze znakiem jako pary bajtów. Konwersja że z powrotem do liczby całkowitej zależy od tego, czy zapisać go forma big-endian:

(byte_array[0]<<8) + (byte_array[1] & 0xff) 

lub little endian:

(byte_array[1]<<8) + (byte_array[0] & 0xff) 
10

W Javie bajty są podpisane, co oznacza, że ​​wartość bajt może być ujemna , a kiedy tak się stanie, oryginalne rozwiązanie @ MattBall nie zadziała.

Na przykład, gdy binarny postać tablicy bajtów tak:

następnie myArray [0] 1000 1101 i myArray [1] 1000 1101, wartość dziesiętną bajtu 1000 1101 jest -115 zamiast 141 (= 2^7 + 2^3 + 2^2 + 2^0)

jeśli stosujemy

int result = (myArray[0] << 8) + myArray[1]

wartość będzie równa -16191, która jest NIEPRAWIDŁOWA.

Powodem jego złe jest to, że gdy interpretujemy tablicę 2-bajtowy do liczby całkowitej, wszystkie bajty są niepodpisane, więc podczas tłumaczenia, należy zmapować podpisane bajtów do unsigned integer:

((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)

wynikiem jest 36237, użyj kalkulatora lub ByteBuffer, aby sprawdzić, czy jest poprawny (zrobiłem to i tak, to prawda).

+0

wielkie dzięki za wyjaśnienie :) – shadygoneinsane

3

Ponadto, jeśli można użyć biblioteki Guava:

Ints.fromByteArray(0, 0, myArray[1], myArray[0]); 

Było warto wspomnieć, ponieważ wiele projektów używać go w każdym razie.

3

Wystarczy to zrobić:

return new BigInteger(byte[] yourByteArray).intValue(); 

Działa świetnie na konwersje poleceń Bluetooth itd. Nie trzeba się martwić o podpisane vs. unsigned konwersji.

Powiązane problemy