Eu sei que certos processadores são Big Endian e outros são Little Endian. Mas existe um comando, script bash, script python ou uma série de comandos que podem ser usados na linha de comando para determinar se um sistema é Big Endian ou Little Endian? Algo como:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
Ou é mais simples apenas determinar qual processador o sistema está usando e seguir com isso para determinar sua Endianess?
Em um sistema Big Endian (Solaris em SPARC)
0
Em um sistema pouco endian (Linux em x86)
1
A solução acima é inteligente e funciona muito bem para Linux *86 e Solaris Sparc.
Eu precisava de uma solução somente shell (sem Perl) que também funcionasse em AIX/Power e HPUX/Itanium. Infelizmente, os dois últimos não funcionam bem: o AIX relata "6" e o HPUX fornece uma linha vazia.
Usando sua solução, consegui criar algo que funcionou em todos esses sistemas Unix:
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
Em relação à solução Python que alguém postou, ela não funciona no Jython porque a JVM trata tudo como Big. Se alguém conseguir fazê-lo funcionar em Jython, por favor poste!
Além disso, encontrei isso, o que explica o endianness de várias plataformas. Alguns hardwares podem operar em qualquer modo, dependendo do que o SO seleciona: http://labs.hoffmanlabs.com/node/544
Se você for usar o awk, esta linha pode ser simplificada para:
Para pequenas caixas Linux que não possuem 'od' (digamos OpenWrt), tente 'hexdump':
Se você estiver em uma máquina Linux bastante recente (quase tudo depois de 2012) ,
lscpu
agora contém esta informação:Isso foi adicionado
lscpu
na versão 2.19, que é encontrada no Fedora >= 17, CentOS >= 6.0, Ubuntu >= 12.04.Observe que encontrei esta resposta nesta excelente resposta no Unix.SE. Essa resposta tem muitas informações relevantes, este post é apenas um resumo dela.
Aqui está um script de uma linha python mais elegante
código de saída
0
significa big endian e1
significa little endianou apenas mude
sys.exit
paraprint
uma saída imprimívelVocê pode tirar proveito do formato de arquivo ELF para determinar a endianness do seu sistema. Por exemplo, imprima os primeiros seis bytes de um arquivo ELF arbitrário em hexadecimal:
Se a última linha (o sexto byte) for 01, de acordo com o formato ELF , 01 é little endian e 02 é big endian.
Se você não tiver um
xxd
na sua caixa (e tiver o busybox), tente isto:A resposta principal pode ser simplificada um pouco usando
awk
:Em um sistema Big Endian (Solaris, SPARC)
Em um sistema Little Endian (Linux, Intel)
Kernels Linux mais recentes
A partir da versão 2.19 do pacote util-linux o comando
lscpu
passou a incluir um campo relacionado a Endianness. Então agora você pode simplesmente usar este comando para descobrir isso:Isso foi confirmado no Ubuntu 12.10 e CentOS 6. Então, eu estaria disposto a assumir que a maioria dos Kernels Linux 3.0+ estão oferecendo isso agora.
Em sistemas Debian/Ubuntu você também pode usar este comando, não tenho certeza de quando ele se tornou disponível:
Referências
Este script Python deve funcionar para você:
Seria imprimir a endianess do sistema.
Eu encontrei uma maneira de fazer isso em Jython. Como o Jython (Python na JVM) é executado em uma VM, ele sempre relata big endian, independentemente do hardware.
Esta solução funciona para Linux, Solaris, AIX e HPUX. Não testei no Windows:
Um comando de linha única baseado no formato ELF:
hexdump -s 5 -n 1 /bin/sh
Requisito um pouco diferente: eu preciso de um teste como este em um script de configuração de compilação de programa para determinar se a máquina de destino de compilação é bit ou little endian, sem executar código . O script deve depositar
#define HAVE_LITTLE_ENDIAN 1
em umconfig.h
cabeçalho, ou então#define HAVE_LITTLE_ENDIAN 0
.A máquina de destino da compilação pode ser diferente da máquina de compilação, pois podemos estar fazendo compilação cruzada, o que também explica por que o teste não deve tentar executar nenhum código compilado. Está fora de questão ter um pequeno programa em C com uma
printf
declaração que cuspa a resposta.Uma possível solução é esta. Geramos um arquivo chamado
conftest.c
que contém isso:Agora, compilamos isso
conftest.o
usando:Então executamos:
Se a string
PSILXINUEROCMIWD
ocorrer, o destino será little-endian. Se a stringLISPUNIXCOREDWIM
ocorrer, é big-endian. Se nenhuma das seqüências ocorrer ou, ainda mais surpreendentemente, ambas ocorrerem, então o teste falhou.Essa abordagem funciona porque as constantes "fourcc" calculadas no programa têm valores independentes da máquina, denotando os mesmos inteiros independentemente da endianness. Sua representação de armazenamento no arquivo de objeto segue o endianness do sistema de destino, e isso é visível por meio da exibição baseada em caracteres em
strings
.As duas palavras de guarda zero garantem que a string seja isolada. Isso não é estritamente necessário, mas garante que a string que estamos procurando não esteja embutida em alguma outra string, o que significa que
strings
a produzirá em uma linha sozinha.PS, a
USPELL
macro não coloca entre parênteses as inserções de argumento porque é criada para esse propósito específico, não para reutilização.