Pregunta ¿Cómo saber si un sistema Linux es big endian o little endian?


Sé que ciertos procesadores son Big Endian y otros son Little Endian. Pero, ¿hay un comando, un script bash, un script de Python o una serie de comandos que se puedan usar en la línea de comandos para determinar si un sistema es Big Endian o Little Endian? Algo como:

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

¿O es más simple simplemente determinar qué procesador está utilizando el sistema e ir con eso para determinar su Endianess?


82
2017-07-23 16:58


origen


Aquí está la solución usando perl: stackoverflow.com/questions/2610849/… - slu


Respuestas:


En un sistema Big Endian (Solaris en SPARC)

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

0

En un sistema little endian (Linux en x86)

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

1


La solución anterior es inteligente y funciona muy bien para Linux * 86 y Solaris Sparc.

Necesitaba una solución de solo shell (sin Perl) que también funcionara en AIX / Power y HPUX / Itanium. Desafortunadamente, los dos últimos no funcionan bien: AIX informa "6" y HPUX da una línea vacía.

Usando su solución, pude crear algo que funcionó en todos estos sistemas Unix:

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

Respecto a la solución Python que alguien publicó, no funciona en Jython porque la JVM trata todo como Grande. Si alguien puede hacerlo funcionar en Jython, por favor publique!

Además, encontré esto, lo que explica la endianness de varias plataformas. Algunos hardware pueden operar en cualquier modo dependiendo de lo que seleccione el O / S: http://labs.hoffmanlabs.com/node/544


Si vas a usar awk, esta línea se puede simplificar para:

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

Para cajas pequeñas de Linux que no tienen 'od' (por ejemplo, OpenWrt), intente 'hexdump':

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

102
2017-07-23 17:04



Eso es una mayúscula I (ojo) en lugar de minúsculas l (ell) por cierto. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), aunque Sparc> = V9 es bi endian. - Cristian Ciupitu
¿Te importa explicar cómo funciona? - Massimo
Esto no parece funcionar en Android (Nexus 5). No estoy seguro de por qué ... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Aquí hay un script de una línea de python más elegante.

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

código de salida 0 significa big endian y 1 significa poco endian

o simplemente cambiar sys.exit a print para una salida imprimible


29
2018-05-21 20:26



Esto no funcionará en los sistemas RHEL 5.x / CentOS 5.x que ejecutan Python 2.4.x. Aquí hay una solución: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Si estás en una máquina Linux bastante reciente (casi nada después de 2012) entonces lscpu Ahora contiene esta información:

$ lscpu | grep Endian
Byte Order:            Little Endian

Esto fue agregado a lscpu en la versión 2.19, que se encuentra en Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.

Tenga en cuenta que he encontrado esta respuesta de Esta excelente respuesta en Unix.SE. Esa respuesta tiene mucha información relevante, esta publicación es solo un resumen de la misma.


26
2018-06-15 11:26





La respuesta principal se puede simplificar ligeramente usando awk:

En un sistema Big Endian (Solaris, SPARC)

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

En un sistema Little Endian (Linux, Intel)

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

Nuevos kernels de linux

A partir de la versión 2.19 del paquete util-linux el comando lscpu Comenzó a incluir un campo relacionado con endianness. Así que ahora puedes simplemente usar este comando para encontrar esto:

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

Esto se ha confirmado en Ubuntu 12.10 y CentOS 6. Por lo tanto, estaría dispuesto a asumir que la mayoría de los más de 3.0 Kernels de Linux ahora ofrecen esto.

En los sistemas Debian / Ubuntu también puede usar este comando, sin estar seguro de cuándo estuvo disponible:

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

Referencias


10
2017-08-30 23:41





Este script de Python debería funcionar para usted:

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



Un trazador de líneas: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". El código de salida es 0 para big endian y 1 para little endian. - Cristian Ciupitu
¡Decir ah! ¡Con buena pinta! ¡Gracias chicos! - Viet


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

Imprimiría la endianess del sistema.


6
2018-05-28 07:17





Encontré una manera de hacerlo en Jython. Dado que Jython (Python en la JVM) se ejecuta en una máquina virtual, siempre informa big endian, independientemente del hardware.

Esta solución funciona para Linux, Solaris, AIX y HPUX. No he probado en 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