2013-03-22 14 views
7

Wszystko, co muszę zrobić, to przekonwertować niepodpisaną tablicę bajtową na liczbę całkowitą. Wiem, wiem, Java nie ma niepodpisanych typów danych, ale moje liczby są w udawanych, niepodpisanych bajtach.Java unsigned byte [2] to int?

byte[] b = {(byte)0x88, (byte)0xb8}; // aka 35000 
int i = (byte)b[0] << 8 | (byte)b[1]; 

Problem jest to, że nie konwertuje poprawnie, ponieważ uważa, że ​​te są podpisane bajtów ... Jak mogę przekonwertować go z powrotem do int?

+0

Konwertuj na int, a następnie wykonaj przesunięcie. – Apurv

+0

To naprawdę nie jest duplikowane. Połączone pytanie to około 2 bajty na int niepodpisane bajty. Możesz wywnioskować, że musisz maskować pierwszy bajt od pierwszej odpowiedzi, ale to wcale nie jest oczywiste. Nie rozumiem, jak mogli oznaczyć tę odpowiedź jako zduplikowaną. Czy sprawdzono przed zaakceptowaniem? Czy możemy to zgłosić? – BaptisteL

Odpowiedz

17

Brak liczby bez znaku w języku Java, bajtach, intach lub cokolwiek innego. Kiedy bajty są konwertowane na int przed przesunięciem bitu, są one przedłużane znakiem, tj. 0x88 =>0xFFFFFF88. Musisz maskować to, czego nie potrzebujesz.

Spróbuj

int i = ((b[0] << 8) & 0x0000ff00) | (b[1] & 0x000000ff); 

a dostaniesz 35000

2

Można użyć

int i = ((b[0] & 0xFF) << 8) | (b[1] & 0xFF); 

lub

int i = ByteBuffer.wrap(b).getChar(); 

lub

int i = ByteBuffer.wrap(b).getShort() & 0xFFFF; 
Powiązane problemy