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é.