在 Linux 中是否有系统命令报告字节序?

slm*_*slm 38 cpu-architecture

有谁知道报告系统是 Big Endian 还是 Little Endian 的命令,或者最好的选择是使用 Perl 或一串命令这样的技术吗?

珀尔

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

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321
Run Code Online (Sandbox Code Playgroud)

欧 | awk

# 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
Run Code Online (Sandbox Code Playgroud)

参考

Dav*_*man 45

逻辑处理器

lscpu命令显示(除其他外):

Byte Order:            Little Endian
Run Code Online (Sandbox Code Playgroud)

已知可以使用的系统

  • CentOS 6
  • Ubuntu(12.04、12.10、13.04、13.10、14.04)
  • 软呢帽 (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian(因此也假设 Debian 测试)。

已知无法运行的系统

  • 软呢帽 14
  • CentOS 5(因此假设为 RHEL5)

为什么不同发行版之间存在明显差异?

经过多次挖掘,我发现了原因。看起来 util-linux 2.19 版是第一个包含该功能的版本,该功能lscpu向您显示报告系统字节序的输出。

作为测试,我在 Fedora 14 系统上编译了 2.18 和 2.19 版本,下面的输出显示了差异:

util-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
Run Code Online (Sandbox Code Playgroud)

util-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
Run Code Online (Sandbox Code Playgroud)

以上版本是从kernel.org 网站下载的。


cuo*_*glm 9

使用python

$ python -c "import sys;print sys.byteorder"
little
Run Code Online (Sandbox Code Playgroud)

或者:

printf '\1' | od -dAn
1
Run Code Online (Sandbox Code Playgroud)

哪里1是小端和00256大端。

或者使用较短的perl版本:

$ perl -V:byteorder
byteorder='12345678';
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 7

我在 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
Run Code Online (Sandbox Code Playgroud)

这将根据您的系统所包含的架构向您显示“小”或“大”两个词:

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little
Run Code Online (Sandbox Code Playgroud)


小智 5

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
Run Code Online (Sandbox Code Playgroud)