Ich weiß, dass bestimmte Prozessoren Big Endian und andere Little Endian sind. Aber gibt es einen Befehl, ein Bash-Skript, ein Python-Skript oder eine Reihe von Befehlen, die in der Befehlszeile verwendet werden können, um festzustellen, ob ein System Big Endian oder Little Endian ist? So etwas wie:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
Oder ist es einfacher festzustellen, welchen Prozessor das System verwendet, und anhand dessen die Endianess zu bestimmen?
central-processing-unit
Jake Wilson
quelle
quelle
Antworten:
Auf einem Big Endian-System (Solaris auf SPARC)
0
Auf einem kleinen Endian-System (Linux auf x86)
1
Die obige Lösung ist clever und funktioniert hervorragend für Linux * 86 und Solaris Sparc.
Ich brauchte eine reine Shell-Lösung (ohne Perl), die auch unter AIX / Power und HPUX / Itanium funktioniert. Leider spielen die letzten beiden nicht gut: AIX meldet "6" und HPUX gibt eine leere Zeile aus.
Mit Ihrer Lösung konnte ich etwas herstellen, das auf all diesen Unix-Systemen funktioniert:
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
In Bezug auf die Python-Lösung, die jemand veröffentlicht hat, funktioniert sie in Jython nicht, da die JVM alles als "Groß" behandelt. Wenn es jemand in Jython zum Laufen bringen kann, poste es bitte!
Außerdem habe ich dies gefunden, was die Endianze verschiedener Plattformen erklärt. Einige Hardware-Komponenten können in beiden Modi betrieben werden, abhängig von der Auswahl des Betriebssystems: http://labs.hoffmanlabs.com/node/544
Wenn Sie awk verwenden, kann diese Zeile vereinfacht werden:
Für kleine Linux-Boxen, die kein 'od' haben (sagen Sie OpenWrt), versuchen Sie 'hexdump':
quelle
I
eher ein Großbuchstabe (Auge) als ein Kleinbuchstabel
(Ell).printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
Wenn Sie auf einen relativ neuen Linux - Rechner sind (fast alles nach 2012) dann
lscpu
enthält jetzt folgende Informationen:Dies wurde
lscpu
in Version 2.19 hinzugefügt , die sich in Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04 befindet.Beachten Sie, dass ich diese Antwort von dieser großartigen Antwort auf Unix.SE gefunden habe . Diese Antwort enthält viele relevante Informationen. Dieser Beitrag ist nur eine Zusammenfassung.
quelle
Hier ist ein eleganteres einzeiliges Python-Skript
Exit-Code
0
bedeutet "Big Endian" und1
"Little Endian"oder wechseln Sie einfach
sys.exit
zuprint
für eine druckbare Ausgabequelle
python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
Die Hauptantwort kann leicht vereinfacht werden mit
awk
:Auf einem Big Endian-System (Solaris, SPARC)
Auf einem Little Endian-System (Linux, Intel)
Neuere Linux-Kernel
Ab Version 2.19 des Pakets util-linux wurde der Befehl
lscpu
mit einem Feld für Endianness gestartet. Jetzt können Sie einfach diesen Befehl verwenden, um dies herauszufinden:Dies wurde unter Ubuntu 12.10 und CentOS 6 bestätigt. Daher würde ich davon ausgehen, dass die meisten Linux-Kernel ab Version 3.0 dies anbieten.
Auf Debian / Ubuntu-Systemen können Sie auch diesen Befehl verwenden, da Sie sich nicht sicher sind, wann er verfügbar wurde:
Verweise
quelle
Dieses Python-Skript sollte für Sie funktionieren:
quelle
python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))"
. Der Exit-Code ist 0 für Big Endian und 1 für Little Endian.Es würde die Endianess des Systems drucken.
quelle
Sie können das ELF-Dateiformat nutzen, um die Endianze Ihres Systems zu bestimmen. Drucken Sie beispielsweise die ersten sechs Bytes einer beliebigen ELF-Datei in hexadezimaler Schreibweise aus:
xxd -c 1 -l 6 /bin/ls
0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .
Wenn die letzte Zeile (das sechste Byte) gemäß ELF-Format 01 ist, ist 01 Little Endian und 02 Big Endian.
Wenn Sie keine
xxd
auf Ihrer Box haben (und über eine Busybox verfügen), versuchen Sie Folgendes:hexdump -s 5 -n 1 -C /bin/busybox
quelle
Ich habe einen Weg gefunden, dies in Jython zu tun. Da Jython (Python auf der JVM) auf einer VM ausgeführt wird, meldet es unabhängig von der Hardware immer Big Endian.
Diese Lösung funktioniert unter Linux, Solaris, AIX und HPUX. Habe noch nicht unter Windows getestet:
quelle
Ein einzeiliger Befehl basierend auf dem ELF-Format:
hexdump -s 5 -n 1 /bin/sh
quelle
Etwas andere Anforderung: Ich benötige einen Test wie diesen in einem Programmbuild-Konfigurationsskript, um festzustellen, ob der Kompilierungszielcomputer Bit oder Little Endian ist, ohne Code auszuführen . Das Skript muss
#define HAVE_LITTLE_ENDIAN 1
in einemconfig.h
Header abgelegt werden , sonst#define HAVE_LITTLE_ENDIAN 0
.Die Kompilierungszielmaschine unterscheidet sich möglicherweise von der Buildmaschine, da es sich möglicherweise um eine Kreuzkompilierung handelt. Dies erklärt auch, warum der Test nicht versuchen darf, kompilierten Code auszuführen. Es steht außer Frage, ein kleines C-Programm mit einer
printf
Aussage zu haben, die die Antwort ausspuckt.Eine mögliche Lösung ist dies. Wir generieren eine Datei mit dem Namen
conftest.c
:Nun kompilieren wir dies
conftest.o
mit:Dann laufen wir:
Wenn die Zeichenfolge
PSILXINUEROCMIWD
vorkommt, ist das Ziel Little Endian. Wenn die ZeichenfolgeLISPUNIXCOREDWIM
vorkommt, ist es Big-Endian. Wenn keine der beiden Zeichenfolgen vorkommt oder erstaunlicherweise beide, ist der Test fehlgeschlagen.Dieser Ansatz funktioniert, weil die im Programm berechneten "fourcc" -Konstanten maschinenunabhängige Werte haben, die unabhängig von der Endianzahl dieselben Ganzzahlen bezeichnen. Ihre Speicherdarstellung in der Objektdatei folgt der Endianität des Zielsystems und ist über die zeichenbasierte Ansicht unter sichtbar
strings
.Die zwei Null-Schutzwörter stellen sicher, dass die Zeichenfolge isoliert ist. Dies ist nicht unbedingt erforderlich, stellt jedoch sicher, dass die gesuchte Zeichenfolge nicht in eine andere Zeichenfolge eingebettet ist, sodass
strings
sie in einer eigenen Zeile ausgegeben wird.PS: Das
USPELL
Makro setzt die Argumenteinfügungen nicht in Klammern, da es für diesen speziellen Zweck erstellt wurde und nicht für die Wiederverwendung.quelle