2012-03-24 13 views
8

Mam bajt [4], który zawiera 32-bitową liczbę całkowitą bez znaku (w dużej kolejności endian) i muszę ją przekonwertować na długą (jak int może 't posiadać niepodpisany numer).Konwersja 32-bitowych liczb całkowitych bez znaku (duży endian) do długiego i wstecznego

Ponadto, w jaki sposób mogę to zrobić odwrotnie (tj. Od długiego, który zawiera 32-bitową liczbę całkowitą bez znaku do bajtu [4])?

+0

skąd pochodzi tablica bajtów? – Raffaele

+0

@Raffaele z pliku – Aviram

Odpowiedz

12

Brzmi jak praca dla ByteBuffer.

trochę jak

public static void main(String[] args) { 
    byte[] payload = toArray(-1991249); 
    int number = fromArray(payload); 
    System.out.println(number); 
} 

public static int fromArray(byte[] payload){ 
    ByteBuffer buffer = ByteBuffer.wrap(payload); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    return buffer.getInt(); 
} 

public static byte[] toArray(int value){ 
    ByteBuffer buffer = ByteBuffer.allocate(4); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    buffer.putInt(value); 
    buffer.flip(); 
    return buffer.array(); 
} 
+0

Popraw mnie, jeśli się mylę, ale jeśli zrobię 'int value = buffer.getInt();' int może nie być w stanie zawierać całego numeru (jeśli jest niepodpisany i nie jest podpisany) . – Aviram

+0

@Aviram Liczba całkowita w języku Java jest 32-bitowa (4 bajty), o ile twój ByteBuffer ma 4 bajty, nie widzę powodu, dla którego powinien wystąpić problem. Ulepszyłem swoją odpowiedź i przetestowałem ją pozytywnie i negatywnie i do tej pory działa dobrze. Czy mogę czegoś nie zauważyć? Jeśli zamierzasz używać liczb całkowitych bez znaku, użyj longs, a nie liczb całkowitych, ponieważ liczby całkowite w Javie są podpisane. –

+3

Możesz użyć 'return buffer.getInt() i 0xFFFFFFFFL;' jak zawsze otrzymasz wartość bez znaku. Domyślnie ByteBuffer ma BIG_ENDIAN. Nie musisz wywoływać 'flip()', aby użyć 'tablica()' –

8

Można użyć ByteBuffer, czy można to zrobić w staromodny sposób:

long result = 0x00FF & byteData[0]; 
result <<= 8; 
result += 0x00FF & byteData[1]; 
result <<= 8; 
result += 0x00FF & byteData[2]; 
result <<= 8; 
result += 0x00FF & byteData[3]; 
Powiązane problemy