Nuestro equipo de especialistas luego de varios días de investigación y recopilar de datos, han obtenido los datos necesarios, deseamos que te sea útil para tu trabajo.
Solución:
Solución 1:
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 solo de 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
Con respecto a la solución de Python que alguien publicó, no funciona en Jython porque JVM trata todo como Big. Si alguien puede hacer que funcione en Jython, ¡por favor publíquelo!
Además, encontré esto, que explica la endianidad 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 va a usar awk, esta línea se puede simplificar a:
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 con ‘hexdump’:
echo -n I | hexdump -o | awk ' print substr($2,6,1); exit'
Solución 2:
Si está en una máquina Linux bastante reciente (casi cualquier cosa después de 2012) entonces lscpu
ahora contiene esta información:
$ lscpu | grep Endian
Byte Order: Little Endian
Esto fue añadido a lscpu
en la versión 2.19, que se encuentra en Fedora >= 17, CentOS >= 6.0, Ubuntu >= 12.04.
Tenga en cuenta que encontré esta respuesta de esta excelente respuesta en Unix.SE. Esa respuesta tiene mucha información relevante, esta publicación es solo un resumen de ella.
Solución 3:
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 little endian
o simplemente cambiar sys.exit
para print
para una salida imprimible
Solución 4:
Puede aprovechar el formato de archivo ELF para determinar el endian de su sistema. Por ejemplo, imprima los primeros seis bytes de un archivo ELF arbitrario en hexadecimal:
xxd -c 1 -l 6 /bin/ls
0000000: 7f .
0000001: 45 E
0000002: 4c L
0000003: 46 F
0000004: 02 .
0000005: 01 .
Si la última línea (el byte sexado) es 01, según el formato ELF, 01 es little endian y 02 es big endian.
Si no tienes un xxd
en su caja (y tiene busybox), intente esto:
hexdump -s 5 -n 1 -C /bin/busybox
Solución 5:
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
Kernels de Linux más nuevos
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 averiguarlo:
$ 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 kernels de Linux 3.0+ ahora ofrecen esto.
En los sistemas Debian/Ubuntu también puede usar este comando, no estoy seguro de cuándo estuvo disponible:
$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little
Referencias
- ¿Hay un comando del sistema, en Linux, que informe el endianness?
Finalizando este artículo puedes encontrar las explicaciones de otros gestores de proyectos, tú también tienes la libertad de mostrar el tuyo si lo deseas.