Linux 시스템이 빅 엔디안인지 리틀 엔디안인지 확인하는 방법은 무엇입니까? Little Endian이라는 것을 알고 있습니다. 그러나 시스템이

특정 프로세서는 Big Endian이고 다른 프로세서는 Little Endian이라는 것을 알고 있습니다. 그러나 시스템이 Big Endian인지 Little Endian인지 확인하기 위해 명령 줄에서 사용할 수있는 명령, bash 스크립트, python 스크립트 또는 일련의 명령이 있습니까? 다음과 같은 것 :

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

아니면 시스템이 어떤 프로세서를 사용하고 있는지 판단하여 엔디안을 결정하는 것이 더 간단합니까?



답변

빅 엔디안 시스템 (Solaris on SPARC)

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

0

리틀 엔디안 시스템 (x86의 Linux)

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

1


위의 솔루션은 영리하며 Linux * 86 및 Solaris Sparc에 적합합니다.

AIX / Power 및 HPUX / Itanium에서도 작동하는 쉘 전용 (Perl 없음) 솔루션이 필요했습니다. 불행히도 마지막 두 가지는 좋지 않습니다. AIX는 “6”을보고하고 HPUX는 빈 줄을 제공합니다.

귀하의 솔루션을 사용하여 모든 유닉스 시스템에서 작동하는 것을 만들 수있었습니다.

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

누군가가 게시 한 Python 솔루션과 관련하여 JVM은 모든 것을 Big으로 취급하기 때문에 Jython에서는 작동하지 않습니다. 누구나 자이 썬에서 작동시킬 수 있다면 게시하십시오!

또한 다양한 플랫폼의 엔디안을 설명하는 이것을 발견했습니다. 일부 하드웨어는 O / S 선택에 따라 두 모드 중 하나로 작동 할 수 있습니다. http://labs.hoffmanlabs.com/node/544


awk를 사용하려는 경우이 줄을 다음과 같이 단순화 할 수 있습니다.

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

‘od'(예 : OpenWrt)가없는 작은 Linux 상자의 경우 ‘hexdump’를 시도하십시오.

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

답변

상당히 최근의 Linux 머신 (2012 년 이후 대부분) 에 있다면 다음 lscpu정보가 포함됩니다.

$ lscpu | grep Endian
Byte Order:            Little Endian

이것은 lscpu버전 2.19에서 추가 되었으며 Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04에 있습니다.

나는에서이 대답을 발견합니다 Unix.SE에이 훌륭한 대답을 . 그 대답은 많은 관련 정보를 가지고 있으며,이 게시물은 그 정보를 요약 한 것입니다.


답변

더 우아한 파이썬 한 줄 스크립트가 있습니다.

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

종료 코드 0는 빅 엔디안을 1의미하며 리틀 엔디안을 의미합니다

아니면 그냥 변경 sys.exitprint인쇄 가능한 출력


답변

주요 답변은 다음을 사용하여 약간 단순화 할 수 있습니다 awk.

Big Endian 시스템 (Solaris, SPARC)

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

Little Endian 시스템 (Linux, Intel)

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

최신 리눅스 커널

util-linux 패키지 버전 2.19 lscpu부터 Endianness 관련 필드를 포함 하여 명령이 시작되었습니다. 이제이 명령을 사용하여 간단히 찾을 수 있습니다.

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

이것은 Ubuntu 12.10 및 CentOS 6에서 확인되었습니다. 따라서 대부분의 3.0+ Linux 커널이 현재 이것을 제공한다고 가정합니다.

데비안 / 우분투 시스템에서는 언제 사용할 수 있는지 확실하지 않은이 명령을 사용할 수도 있습니다.

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

참고 문헌


답변

이 파이썬 스크립트는 당신을 위해 작동해야합니다 :

#!/usr/bin/env python
from struct import pack
if pack('@h', 1) == pack('<h', 1):
    print "Little Endian"
else:
    print "Big Endian"

답변

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

시스템의 endianess를 인쇄합니다.


답변

ELF 파일 형식을 활용하여 시스템의 엔디안을 결정할 수 있습니다. 예를 들어, 임의의 ELF 파일의 처음 6 바이트를 16 진수로 인쇄하십시오.

xxd -c 1 -l 6 /bin/ls


0000000: 7f .
0000001: 45 E
0000002: 4c L
0000003: 46 F
0000004: 02 .
0000005: 01 .

ELF 형식 에 따라 마지막 행 (육각 바이트)이 01 인 경우 01은 리틀 엔디안이고 02는 빅 엔디안입니다.

xxd상자에 기능 이 없으면 (비지 박스가있는 경우) 다음을 시도하십시오.

hexdump -s 5 -n 1 -C /bin/busybox