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?
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.
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.
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.
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.Po Stronie C każdy bajt ma tne LSB na początku jest po lewej stronie, a MSB na końcu.
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;
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.
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.
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 .
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