Vraag Hoe weet je of een Linux-systeem big endian of little endian is?


Ik weet dat bepaalde processors Big Endian zijn en anderen Little Endian. Maar is er een commando, bash-script, pythonscript of reeks opdrachten die op de opdrachtregel kunnen worden gebruikt om te bepalen of een systeem Big Endian of Little Endian is? Zoiets als:

if <some code> then
    echo Big Endian
else
    echo Little Endian
fi

Of is het eenvoudiger om gewoon vast te stellen welke processor het systeem gebruikt en om daarmee de Endianess te bepalen?


82
2017-07-23 16:58


oorsprong


Hier is de oplossing met perl: stackoverflow.com/questions/2610849/... - slu


antwoorden:


Op een Big Endian-systeem (Solaris op SPARC)

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

0

Op een klein endiaans systeem (Linux op x86)

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

1


De bovenstaande oplossing is slim en werkt geweldig voor Linux * 86 en Solaris Sparc.

Ik had een shell-only (geen Perl) -oplossing nodig die ook werkte op AIX / Power en HPUX / Itanium. Helaas spelen de laatste twee niet leuk: AIX rapporteert "6" en HPUX geeft een lege regel.

Met jouw oplossing kon ik iets maken dat werkte op al deze Unix-systemen:

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

Wat betreft de Python-oplossing die iemand heeft geplaatst, werkt deze niet in Jython omdat de JVM alles als Big behandelt. Als iemand het in Jython kan laten werken, post dan!

Ook vond ik dit, wat de endianness van verschillende platforms verklaart. Sommige hardware kan in beide modi werken, afhankelijk van wat de O / S selecteert: http://labs.hoffmanlabs.com/node/544


Als je awk gaat gebruiken, kan deze regel vereenvoudigd worden om:

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

Voor kleine Linux-boxes die geen 'od' hebben (zeg OpenWrt), probeer dan 'hexdump':

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

102
2017-07-23 17:04



Dat is een hoofdletter I (oog) in plaats van een kleine letter l (Ell) trouwens. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), hoewel Sparc> = V9 bi endian is. - Cristian Ciupitu
Wil je uitleggen hoe het werkt? - Massimo
Dit lijkt niet te werken op Android (Nexus 5). Niet zeker waarom... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Hier is een eleganter Python-script met één regel

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

exit code 0 betekent big endian en 1 betekent klein endian

of gewoon veranderen sys.exit naar print voor een afdrukbare uitvoer


29
2018-05-21 20:26



Dit werkt niet op RHEL 5.x / CentOS 5.x-systemen waarop Python 2.4.x wordt uitgevoerd. Hier is een oplossing: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Als je op een redelijk recente Linux-machine bent (bijna alles na 2012) dan lscpu bevat nu deze informatie:

$ lscpu | grep Endian
Byte Order:            Little Endian

Dit is toegevoegd aan lscpu in versie 2.19, die te vinden is in Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.

Merk op dat ik dit antwoord heb gevonden dit geweldige antwoord op Unix.SE. Dat antwoord heeft veel relevante informatie, dit bericht is slechts een samenvatting ervan.


26
2018-06-15 11:26





Het belangrijkste antwoord kan enigszins worden vereenvoudigd met awk:

Op een Big Endian-systeem (Solaris, SPARC)

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

Op een Little Endian-systeem (Linux, Intel)

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

Nieuwere Linux-kernel

Vanaf versie 2.19 van het util-linux-pakket de opdracht lscpu begon met een veld gerelateerd aan Endianness. Dus nu kunt u eenvoudig dit commando gebruiken om dit te achterhalen:

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

Dit is bevestigd op Ubuntu 12.10 en CentOS 6. Dus ik zou willen aannemen dat de meeste 3.0+ Linux Kernels dit nu aanbieden.

Op Debian / Ubuntu-systemen kunt u dit commando ook gebruiken, niet zeker wanneer het beschikbaar werd:

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

Referenties


10
2017-08-30 23:41





Dit Python-script zou voor u moeten werken:

#!/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



Oneliner: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". De exitcode is 0 voor big endian en 1 voor little endian. - Cristian Ciupitu
Ha! Best netjes! Bedankt jongens! - Viet


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

Het zou de endianess van het systeem afdrukken.


6
2018-05-28 07:17





Ik heb een manier gevonden om het in Jython te doen. Omdat Jython (Python op de JVM) op een VM draait, rapporteert het altijd big endian, ongeacht de hardware.

Deze oplossing werkt voor Linux, Solaris, AIX en HPUX. Niet getest op Windows:

    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





U kunt gebruikmaken van het ELF-bestandsformaat om de eindigheid van uw systeem te bepalen. Print bijvoorbeeld de eerste zes bytes van een willekeurig ELF-bestand in hex:

xxd -c 1 -l 6 /bin/ls

0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .

Als de laatste regel (de vaste byte) 01 is, volgens ELF-formaat, 01 is klein endian en 02 is big endian.


3
2018-01-15 18:23



Dit is precies wat ik nodig had. Bedankt! - Vasily G
Ik denk dat je bedoelt van een willekeurige ELF ... Omdat er andere uitvoerbare typen zijn, inclusief shell-scripts, perl, python, etc. Je zegt echter niet dat je het bij het verkeerde eind hebt, alleen maar zeggen dat het de moeite waard is te onthouden dat er andere uitvoerbare typen zijn (en voor interesse bevindt de code zich in het tekstsegment, vandaar de bezetfout van het oude tekstbestand). - Pryftan
@Pryftan Bedankt voor het wijzen. Gecorrigeerd! - Tong Zhou
@TongZhou Welkom; blij om te helpen! - Pryftan