135 votes

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, bash script, Python script ou une série de commandes qui peuvent être utilisées à la 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 le processeur utilisé par le système et de s'en servir pour déterminer son Endienneté ?

9voto

jason saldo Points 5036

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"

9voto

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

Il imprimerait le caractère endiablé du système.

3voto

Fergal Points 768

J'ai trouvé un moyen de le faire en Jython. Puisque Jython (Python on the JVM) fonctionne sur une VM, il rapporte toujours big endian, quel que soit le matériel.

Cette solution fonctionne pour Linux, Solaris, AIX et HPUX. Elle n'a pas été testée sous Windows :

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

2voto

fae Points 29

Une commande à une ligne basée sur le format ELF :
hexdump -s 5 -n 1 /bin/sh

2voto

MayeulC Points 130

Je déteste un peu la réponse qui s'appuie sur le format ELF, car il n'est pas utilisé partout (ça pourrait être scripts, ou un autre binfmt, ou même un système cygwin). Voici une solution relativement portable qui ne s'appuie que sur POSIX et hexdump (donc compatible avec busybox, si l'on vise la compatibilité POSIX, awk devrait être utilisé à la place) :

if test `printf '\0\1' | hexdump -e '/2 "%04x"'` -eq 0100
then
    echo little
else
    echo big
fi

Tester également pour le middle-endian :

case `printf '\0\1\2\3' | hexdump -e '/4 "%08x"'` in
03020100) echo little;;
00010203) echo big;;
01000302) echo mid-big;;
02030001) echo mid-little;; # these two might be swapped, adjust accordingly
*) echo unknown endianness
esac

Comment cela fonctionne-t-il ? Printf imprime octet par octet, dans l'ordre : 00 01 .

El hexdump a été adapté de aquí . El /4 lui demande d'appliquer le formatage à des groupes de 4 octets à la fois. Le site "%08x" est le format de sortie (8 caractères hexadécimaux avec un 0 en tête). L'idée ici est qu'il va lire le nombre dans son endiennage natif, et l'afficher dans un format big endian "lisible par l'homme". X -> Y endian est le même swap que Y -> X. Donc big -> native est fait ici par hexdump, même s'il est supposé faire native -> big.

Si quelqu'un a une explication mathématique à ce sujet, je serais curieux BTW. Echanger deux fois est équivalent à l'identité.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X