Wiem, że niektóre procesory to Big Endian, a inne to Little Endian. Ale czy istnieje polecenie, skrypt bash, skrypt Pythona lub seria poleceń, których można użyć w wierszu poleceń, aby ustalić, czy system to Big Endian czy Little Endian? Coś jak:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
Czy może łatwiej jest po prostu określić, jakiego procesora używa system i przejść do tego, aby określić jego Endianess?
central-processing-unit
Jake Wilson
źródło
źródło
Odpowiedzi:
W systemie Big Endian (Solaris na SPARC)
0
Na małym systemie endian (Linux na x86)
1
Powyższe rozwiązanie jest sprytne i działa świetnie w systemach Linux * 86 i Solaris Sparc.
Potrzebowałem rozwiązania opartego tylko na powłoce (bez Perla), które działałoby również w systemach AIX / Power i HPUX / Itanium. Niestety dwa ostatnie nie są dobre: AIX zgłasza „6”, a HPUX podaje pustą linię.
Korzystając z twojego rozwiązania, udało mi się stworzyć coś, co działałoby na tych wszystkich systemach uniksowych:
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
Jeśli chodzi o rozwiązanie w języku Python, które ktoś opublikował, nie działa w Jython, ponieważ JVM traktuje wszystko jako duże. Jeśli ktokolwiek może zmusić go do działania w Jython, proszę pisać!
Znalazłem też to, co tłumaczy endianizm różnych platform. Niektóre urządzenia mogą działać w dowolnym trybie, w zależności od wybranych przez O / S: http://labs.hoffmanlabs.com/node/544
Jeśli zamierzasz użyć awk, tę linię można uprościć do:
W przypadku małych urządzeń z systemem Linux, które nie mają „od” (powiedzmy OpenWrt), spróbuj „hexdump”:
źródło
I
(oko), a nie mała literal
(ell).printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
Jeśli jesteś w dość niedawnym maszynie Linux (najczęściej coś po roku 2012) , a następnie
lscpu
teraz zawiera następujące informacje:Zostało to dodane do
lscpu
wersji 2.19, która znajduje się w Fedorze> = 17, CentOS> = 6.0, Ubuntu> = 12.04.Zauważ, że znalazłem tę odpowiedź z tej niesamowitej odpowiedzi na Unix.SE . Ta odpowiedź zawiera wiele istotnych informacji, ten post jest tylko jej streszczeniem.
źródło
Oto bardziej elegancki, jednowierszowy skrypt Pythona
kod wyjścia
0
oznacza duży endian i1
oznacza mały endianlub po prostu zmień
sys.exit
na,print
aby uzyskać wydrukźródło
python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
Główną odpowiedź można nieco uprościć, używając
awk
:W systemie Big Endian (Solaris, SPARC)
W systemie Little Endian (Linux, Intel)
Nowsze jądra Linux
Od wersji 2.19 pakietu util-linux polecenie
lscpu
zaczęło się, włączając pole związane z Endianness. Teraz możesz po prostu użyć tego polecenia, aby się tego dowiedzieć:Zostało to potwierdzone w Ubuntu 12.10 i CentOS 6. Dlatego zechciałbym założyć, że większość jąder Linuksa 3.0+ oferuje to teraz.
W systemach Debian / Ubuntu możesz także użyć tego polecenia, nie wiedząc, kiedy będzie dostępne:
Bibliografia
źródło
Ten skrypt w Pythonie powinien działać dla Ciebie:
źródło
python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))"
. Kod wyjścia to 0 dla big endian i 1 dla little endian.Wypisuje endianessę systemu.
źródło
Możesz skorzystać z formatu pliku ELF, aby określić endianizm swojego systemu. Na przykład wydrukuj pierwsze sześć bajtów dowolnego pliku ELF w postaci szesnastkowej:
xxd -c 1 -l 6 /bin/ls
0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .
Jeśli ostatni wiersz (szósty bajt) to 01, zgodnie z formatem ELF , 01 to mały endian, a 02 to duży endian.
Jeśli nie masz
xxd
na swoim urządzeniu (i masz zajęty), spróbuj tego:hexdump -s 5 -n 1 -C /bin/busybox
źródło
Znalazłem sposób na zrobienie tego w Jython. Ponieważ Jython (Python na JVM) działa na maszynie wirtualnej, zawsze zgłasza duży endian, niezależnie od sprzętu.
To rozwiązanie działa w systemach Linux, Solaris, AIX i HPUX. Nie testowałem w systemie Windows:
źródło
Polecenie jednowierszowe oparte na formacie ELF:
hexdump -s 5 -n 1 /bin/sh
źródło
Nieco inne wymaganie: Potrzebuję takiego testu w skrypcie konfiguracyjnym kompilacji programu, aby ustalić, czy docelowa maszyna do kompilacji jest bitowa czy mała, bez wykonywania kodu . Skrypt musi zostać złożony
#define HAVE_LITTLE_ENDIAN 1
wconfig.h
nagłówku, w przeciwnym razie#define HAVE_LITTLE_ENDIAN 0
.Komputer docelowy kompilacji może różnić się od maszyny kompilacji, ponieważ możemy kompilować się wzajemnie, co również wyjaśnia, dlaczego test nie może próbować uruchomić żadnego skompilowanego kodu. Nie ma mowy o małym programie C z
printf
instrukcją, która wyrzuca odpowiedź.Możliwym rozwiązaniem jest to. Generujemy plik o nazwie,
conftest.c
który zawiera:Teraz kompilujemy to
conftest.o
za pomocą:Następnie uruchamiamy:
Jeśli ciąg
PSILXINUEROCMIWD
wystąpi, celem jest little-endian. Jeśli ciągLISPUNIXCOREDWIM
wystąpi, jest to big-endian. Jeśli nie wystąpi żaden ciąg znaków lub, co bardziej zaskakujące, oba wystąpią, oznacza to, że test się nie powiódł.Takie podejście działa, ponieważ obliczone w programie stałe „fourcc” mają wartości niezależne od maszyny, oznaczające te same liczby całkowite niezależnie od endianowości. Ich reprezentacja pamięci w pliku obiektowym jest zgodna z endianizmem systemu docelowego i jest to widoczne w widoku opartym na znakach pod
strings
.Dwa zerowe słowa zabezpieczające zapewniają, że ciąg jest izolowany. Nie jest to absolutnie konieczne, ale zapewnia, że szukany ciąg nie jest osadzony w innym ciągu, co oznacza, że
strings
wyprowadzi go sam w wierszu.PS
USPELL
makro nie nawiasy wstawia argumentów, ponieważ jest spreparowane do tego konkretnego celu, a nie do ponownego użycia.źródło