Linux에서 엔디안을보고하는 시스템 명령이 있습니까? 알고 있습니까? 아니면 Perl

누구든지 시스템이 Big Endian인지 Little Endian인지보고하는 명령을 알고 있습니까? 아니면 Perl 또는 일련의 명령을 사용하여 이와 같은 기술을 사용하는 것이 가장 좋습니다.

# little
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
12345678

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321

od | 어 wk

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

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

참고 문헌



답변

lscpu

lscpu명령은 다음과 같이 표시됩니다.

Byte Order:            Little Endian

이것이 작동하는 것으로 알려진 시스템

  • CentOS 6
  • 우분투 (12.04, 12.10, 13.04, 13.10, 14.04)
  • 페도라 (17,18,19)
  • 아치 리눅스 2012+
  • 리눅스 민트 데비안 (따라서 데비안 테스트도 가정).

작동하지 않는 것으로 알려진 시스템

  • 페도라 14
  • CentOS 5 (이로 인해 RHEL5로 가정)

왜 배포판에 명백한 차이점이 있습니까?

많이 파고 난 후 이유를 알았습니다. util-linux 버전 2.19는 lscpu시스템의 Endianness를보고하는 출력을 보여주는 기능을 포함하는 첫 번째 버전 인 것 같습니다 .

테스트로 Fedora 14 시스템에서 버전 2.18 및 2.19를 모두 컴파일했으며 아래 출력에 차이점이 표시됩니다.

유틸리티 리눅스 2.18

$ util-linux-ng-2.18/sys-utils/lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

유틸리티 리눅스 2.19

$ util-linux-2.19/sys-utils/lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
BogoMIPS:              5320.02
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

위의 버전은 kernel.org 웹 사이트 에서 다운로드되었습니다 .


답변

데비안 / 우분투 시스템에서 찾은 한 가지 방법은이 명령을 실행하는 것입니다.

$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu

시스템 구성에 따라 작거나 큰 단어가 표시됩니다.

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

답변

사용 python:

$ python -c "import sys;print sys.byteorder"
little

또는:

printf '\1' | od -dAn
1

1리틀 엔디안과 빅 엔디안은 어디에 있습니까 00256?

또는 더 짧은 perl버전을 사용하는 경우 :

$ perl -V:byteorder
byteorder='12345678';

답변

POSIX Shell & C 솔루션 :

cat << EOF > foo.c

#include <endian.h>
#include <stdio.h>

int main() {
  printf("Byte Order: ");
  if (BYTE_ORDER == LITTLE_ENDIAN)
    printf("little");
  else {
    if (BYTE_ORDER == BIG_ENDIAN)
      printf("big");
    else
      printf("unknown");
  }
  printf(" endian.\n");
  return 0;
}
EOF

gcc -D__USE_POSIX foo.c
./a.out

답변

다음이없는 시스템 인 경우 endian.h:

#include <stdio.h>

int main() {
  int test = 0;
  char *bytes = (char *) &test;
  *bytes = 0x1;

  printf("Byte Order: ");
  if (test == 1){
    printf("little");
  }
  else {
      printf("big");
  }
  printf(" endian.\n");
  return 0;
}