Frage Wie erkennt man, ob ein Linux-System Big Endian oder Little Endian ist?


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 an 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, einfach festzustellen, welcher Prozessor das System verwendet, und damit die Endanfälligkeit zu bestimmen?


82
2017-07-23 16:58


Ursprung


Hier ist die Lösung mit Perl: stackoverflow.com/questions/2610849/... - slu


Antworten:


Auf einem Big-Endian-System (Solaris auf SPARC)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

0

Auf einem kleinen Endian-System (Linux auf x86)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

1


Die obige Lösung ist clever und funktioniert hervorragend für Linux * 86 und Solaris Sparc.

Ich brauchte eine Shell-only (keine Perl) Lösung, die auch auf AIX / Power und HPUX / Itanium funktionierte. Leider spielen die letzten beiden nicht gut: AIX meldet "6" und HPUX gibt eine Leerzeile.

Mit Ihrer Lösung konnte ich etwas erschaffen, das auf all diesen Unix-Systemen funktioniert:

$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6

Bezüglich der Python-Lösung, die jemand gepostet hat, funktioniert es in Jython nicht, weil die JVM alles als Big behandelt. Wenn jemand es in Jython zur Arbeit bringen kann, bitte posten!

Auch das fand ich, was die Endlichkeit verschiedener Plattformen erklärt. Einige Hardware kann in beiden Modi arbeiten, abhängig davon, was das O / S auswählt: http://labs.hoffmanlabs.com/node/544


Wenn Sie awk verwenden, kann diese Zeile vereinfacht werden zu:

echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}'

Für kleine Linux-Boxen, die kein 'od' haben (zB OpenWrt), versuche 'hexdump':

echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'

102
2017-07-23 17:04



Das ist ein Großbuchstabe I (Auge) statt einem Kleinbuchstaben l (ell) übrigens. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), obwohl Sparc> = V9 bi-endian ist. - Cristian Ciupitu
Möchten Sie erklären, wie es funktioniert? - Massimo
Dies scheint auf Android (Nexus 5) nicht zu funktionieren. Nicht sicher warum... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Hier ist ein eleganteres Python-Skript

python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"

Beendigungscode 0 bedeutet Big Endian und 1 bedeutet kleiner Endian

oder einfach ändern sys.exit zu print für eine druckbare Ausgabe


29
2018-05-21 20:26



Dies funktioniert nicht auf RHEL 5.x / CentOS 5.x Systemen, die Python 2.4.x ausführen. Hier ist eine Lösung: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Wenn Sie auf einem relativ neuen Linux-Rechner arbeiten (fast alles nach 2012) dann lscpu enthält jetzt diese Information:

$ lscpu | grep Endian
Byte Order:            Little Endian

Dies wurde hinzugefügt lscpu in Version 2.19, die in Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04 gefunden wird.

Beachten Sie, dass ich diese Antwort gefunden habe diese grandiose Antwort auf Unix.SE. Diese Antwort hat viele relevante Informationen, dieser Beitrag ist nur eine Zusammenfassung davon.


26
2018-06-15 11:26





Die Hauptantwort kann mit Hilfe von leicht vereinfacht werden awk:

Auf einem Big-Endian-System (Solaris, SPARC)

$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0

Auf einem Little Endian-System (Linux, Intel)

$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1

Neuere Linux-Kernel

Ab Version 2.19 des util-linux-Pakets das Kommando lscpu begann ein Feld mit Bezug zu Endianness aufzunehmen. So können Sie jetzt einfach diesen Befehl verwenden, um dies herauszufinden:

$ lscpu | grep -i byte
Byte Order:            Little Endian

Dies wurde unter Ubuntu 12.10 und CentOS 6 bestätigt. Ich würde also davon ausgehen, dass die meisten 3.0+ Linux-Kernel dies jetzt anbieten.

Auf Debian / Ubuntu-Systemen können Sie auch diesen Befehl verwenden, der nicht sicher ist, wann er verfügbar wurde:

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little

Verweise


10
2017-08-30 23:41





Dieses Python-Skript sollte für Sie funktionieren:

#!/usr/bin/env python
from struct import pack
if pack('@h', 1) == pack('<h', 1):
    print "Little Endian"
else:
    print "Big Endian"

9
2017-07-23 17:28



Einzeiler: 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. - Cristian Ciupitu
Ha! Ziemlich ordentlich! Danke Leute! - Viet


python -c "import sys; print(sys.byteorder)"

Es würde die Endgültigkeit des Systems drucken.


6
2018-05-28 07:17





Ich habe einen Weg gefunden, es in Jython zu machen. Da Jython (Python auf der JVM) auf einer VM ausgeführt wird, meldet es immer Big Endian, unabhängig von der Hardware.

Diese Lösung funktioniert für Linux, Solaris, AIX und HPUX. Habe nicht unter Windows getestet:

    from java.lang import System
    for property, value in dict(System.getProperties()).items():
        if property.endswith('cpu.endian'):
            return value

3
2017-11-30 22:40





Sie können das ELF-Dateiformat nutzen, um die Endlichkeit Ihres Systems zu bestimmen. Drucken Sie beispielsweise die ersten sechs Bytes einer beliebigen ELF-Datei in hexadezimal:

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 sixte Byte) 01 ist, entsprechend ELF-Format, 01 ist Little Endian und 02 ist Big Endian.


3
2018-01-15 18:23



Das ist genau was ich brauchte. Vielen Dank! - Vasily G
Ich denke du meinst eine willkürliche ELF ... Da gibt es andere ausführbare Typen wie Shell-Skripte, Perl, Python, etc. Nicht zu sagen, du liegst falsch, obwohl - nur zu erwähnen, dass es andere ausführbare Typen gibt (und Bei Interesse befindet sich der Code im Textsegment, daher der alte Textdatei-Busy-Fehler). - Pryftan
@ Pryftan Danke, dass du das herausgebracht hast. Korrigiert es! - Tong Zhou
@TongZhou Willkommen; Ich bin froh, Ihnen helfen zu können! - Pryftan


Ein einzeiliger Befehl basierend auf dem ELF-Format:
hexdump -s 5 -n 1 /bin/sh


0
2018-04-01 11:36



Edit: -n 1, Entschuldigung;) - fae
Dies ist die exakt gleiche Methode wie a vorherige Antwort, die auch mehr Details als deine zur Verfügung stellte. - kasperd