Linux에 바이트 순서를 보고하는 시스템 명령이 있습니까?

Linux에 바이트 순서를 보고하는 시스템 명령이 있습니까?

시스템을 보고하는 명령이 Big Endian인지 Little Endian인지, 아니면 최선의 선택이 Perl이나 일련의 명령 기술을 사용하는 것인지 아는 사람이 있습니까?

진주

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

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

OD |

# 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

인용하다

답변1

LSCPU

lscpu명령은 다음 사항을 보여줍니다.

Byte Order:            Little Endian

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

  • 운영체제 6
  • 우분투(12.04, 12.10, 13.04, 13.10, 14.04)
  • 페도라(17,18,19)
  • 아치리눅스 2012+
  • Linux Mint Debian(따라서 Debian 테스트도 가정).

이 시스템은 작동하지 않는 것으로 알려져 있습니다.

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

분포 간에 명백한 차이가 있는 이유는 무엇입니까?

많은 검색 끝에 이유를 찾았습니다. util-linux 버전 2.19 lscpu에는 시스템의 바이트 순서를 보고하는 출력을 표시 하는 기능이 포함된 최초의 버전인 것 같습니다 .

테스트로 Fedora 14 시스템에서 2.18 및 2.19 버전을 컴파일했는데 다음 출력에 차이점이 표시됩니다.

유틸리티Linux 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

유틸리티Linux 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 웹사이트.

답변2

사용 python:

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

또는:

printf '\1' | od -dAn
1

그 중에는 1리틀 엔디안과 00256빅 엔디안이 있습니다.

또는 더 짧은 perl버전을 사용하세요.

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

답변3

Debian/Ubuntu 시스템에서 찾은 한 가지 방법은 다음 명령을 실행하는 것입니다.

$ 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

답변4

시스템에 다음이 없는 경우 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;
}

관련 정보