Czy Java czyta liczby całkowite w little endian czy big endian?

Pytam, ponieważ wysyłam strumień bajtów z procesu C do Javy. Po stronie C 32-bitowa liczba całkowita ma LSB jest pierwszym bajtem, a MSB jest czwartym bajtem.

Moje pytanie brzmi: po stronie Javy kiedy odczytujemy bajt, który został wysłany z procesu C, czym jest endian Po stronie Javy?

Kolejne pytanie: jeśli endian po stronie Javy nie jest taki sam jak ten wysłany, Jak mogę konwertować między nimi?

Author: Basil Bourque, 2008-12-12

6 answers

Użyj sieciowego porządku bajtów (big endian), który i tak jest taki sam jak Java. Zobacz man htons dla różnych tłumaczy w C.

 59
Author: Egil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 10:36:30

Natknąłem się tutaj przez Google i dostałem odpowiedź, że Java jest big endian.

Czytając odpowiedzi chciałbym zwrócić uwagę, że bajty rzeczywiście mają porządek endiański, chociaż na szczęście, jeśli masz do czynienia tylko z mikroprocesorami" mainstreamowymi", prawdopodobnie nigdy go nie spotkasz, ponieważ Intel, Motorola i Zilog zgodzili się co do kierunku zmiany ich układów UART i że MSB bajtu będzie 2 * * 7, a LSB będzie 2 * * 0 w ich procesorach (użyłem notacji mocy FORTRAN do podkreśl ile to ma lat:)).

Natknąłem się na ten problem z niektórymi danymi szeregowego łącza w dół 20+ lat temu, kiedy wymieniliśmy sprzęt interfejsu za 10 000 USD na komputer Mac. Dawno temu opublikowano w NASA Tech brief. Po prostu użyłem tabeli 256 elementów z odwróconymi bitami (tabela[0x01]=0x80 itd.) po przesunięciu każdego bajtu ze strumienia bitowego.

 41
Author: WB Greene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 00:39:59

Nie ma niepodpisanych liczb całkowitych w Javie. Wszystkie liczby całkowite są podpisane i w big endian.

Po Stronie C każdy bajt ma tne LSB na początku jest po lewej stronie, a MSB na końcu.

Wygląda na to, że używasz LSB jako najmniej znaczącego bitu, prawda? LSB zwykle oznacza najmniej znaczący bajt. Endianness nie jest oparty na bitach, ale na bajtach.

Aby przekonwertować z niepodpisanego bajtu na liczbę całkowitą Javy:

int i = (int) b & 0xFF;

Do konwersji z niepodpisanego 32-bitowego little-endian in byte [] to Java long (z czubka mojej głowy, nie testowane):

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;
 18
Author: Jonas Elfström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-11 01:48:26

Nie ma możliwości, aby to miało wpływ na cokolwiek w Javie, ponieważ nie ma (bezpośredniego Nie-API) sposobu na mapowanie niektórych bajtów bezpośrednio do int w Javie.

Każde API, które robi to lub coś podobnego, definiuje zachowanie dość dokładnie, więc powinieneś przejrzeć dokumentację tego API.

 10
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 21:37:19

Odczytałbym bajty jeden po drugim i połączyłbym je w długą wartość. W ten sposób kontrolujesz endianness, a proces komunikacji jest przejrzysty.

 3
Author: Wouter Lievens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 10:27:07

Jeśli pasuje do używanego protokołu, rozważ użycie strumienia danych, gdzie zachowanie jest bardzo dobrze zdefiniowane .

 2
Author: Ilja Preuß,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 22:36:16