Question Comment savoir si un système Linux est big endian ou little endian?


Je sais que certains processeurs sont Big Endian et que d'autres sont Little Endian. Mais existe-t-il une commande, un script bash, un script python ou une série de commandes pouvant être utilisées en ligne de commande pour déterminer si un système est Big Endian ou Little Endian? Quelque chose comme:

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

Ou est-il plus simple de déterminer quel processeur est utilisé par le système et d’y aller pour déterminer son endurance?


82
2017-07-23 16:58


origine


Voici la solution utilisant perl: stackoverflow.com/questions/2610849/… - slu


Réponses:


Sur un système Big Endian (Solaris sur SPARC)

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

0

Sur un système peu endian (Linux sur x86)

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

1


La solution ci-dessus est astucieuse et fonctionne parfaitement pour Linux * 86 et Solaris Sparc.

J'avais besoin d'une solution shell uniquement (sans Perl) fonctionnant également sous AIX / Power et HPUX / Itanium. Malheureusement, les deux derniers ne sont pas agréables à lire: AIX indique "6" et HPUX affiche une ligne vide.

En utilisant votre solution, j'ai pu concevoir quelque chose qui fonctionne sur tous ces systèmes Unix:

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

En ce qui concerne la solution Python que quelqu'un a publiée, cela ne fonctionne pas dans Jython car la machine virtuelle traite tout comme Big. Si quelqu'un peut le faire fonctionner dans Jython, postez-le!

En outre, j'ai trouvé ceci, ce qui explique la finalité de diverses plates-formes. Certains matériels peuvent fonctionner dans les deux modes en fonction de la sélection du système d'exploitation: http://labs.hoffmanlabs.com/node/544


Si vous utilisez awk, cette ligne peut être simplifiée comme suit:

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

Pour les petites machines Linux qui n'ont pas 'od' (dites OpenWrt), essayez alors 'hexdump':

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

102
2017-07-23 17:04



C'est une majuscule I (œil) plutôt que minuscule l (ell) au fait. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), bien que Sparc> = V9 soit bi-final. - Cristian Ciupitu
Voulez-vous expliquer comment cela fonctionne? - Massimo
Cela ne semble pas fonctionner sur Android (Nexus 5). Pas certain de pourquoi... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Voici un script d'une ligne plus élégant en python

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

code de sortie 0 signifie big endian et 1 signifie petit endian

ou juste changer sys.exit à print pour une sortie imprimable


29
2018-05-21 20:26



Cela ne fonctionnera pas sur les systèmes RHEL 5.x / CentOS 5.x qui exécutent Python 2.4.x. Voici un correctif: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Si vous êtes sur une machine Linux assez récente (plus rien après 2012) puis lscpu contient maintenant cette information:

$ lscpu | grep Endian
Byte Order:            Little Endian

Cela a été ajouté à lscpu dans la version 2.19, qui se trouve dans Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.

Notez que j'ai trouvé cette réponse de cette réponse formidable sur Unix.SE. Cette réponse contient de nombreuses informations pertinentes, cet article n’en est qu’un résumé.


26
2018-06-15 11:26





La réponse principale peut être légèrement simplifiée en utilisant awk:

Sur un système Big Endian (Solaris, SPARC)

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

Sur un système Little Endian (Linux, Intel)

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

Nouveaux noyaux Linux

A partir de la version 2.19 du paquet util-linux, la commande lscpu commencé à inclure un domaine lié à Endianness. Alors maintenant, vous pouvez simplement utiliser cette commande pour le savoir:

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

Cela a été confirmé sur Ubuntu 12.10 et CentOS 6. Je serais donc prêt à supposer que la plupart des noyaux Linux 3.0+ offrent maintenant cette fonctionnalité.

Sur les systèmes Debian / Ubuntu, vous pouvez également utiliser cette commande, sans savoir quand elle sera disponible:

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

Références


10
2017-08-30 23:41





Ce script Python devrait fonctionner pour vous:

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



Bon mot: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". Le code de sortie est 0 pour big endian et 1 pour little endian. - Cristian Ciupitu
Ha! Génial! Merci les gars! - Viet


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

Cela imprimerait la finesse du système.


6
2018-05-28 07:17





J'ai trouvé un moyen de le faire avec Jython. Étant donné que Jython (Python sur la machine virtuelle Java) s’exécute sur une machine virtuelle, il génère toujours un rapport big endian, quel que soit le matériel.

Cette solution fonctionne pour Linux, Solaris, AIX et HPUX. Je n'ai pas testé sous 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