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


30

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

佩尔

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

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

od | 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

参考文献


od方法有什么问题?它很简单,可以在任何地方使用。这是我在阅读您的问题的正文之前想到的。
吉尔(Gilles)'所以

@Gilles-真的没什么,感觉有点像黑客(至少对我来说)。的确,它似乎可以在其他系统(例如Solaris + AIX)上移植,但是似乎应该更明确地确定系统的字节序,例如32位与64位,因此我对此感到有些惊讶。 t。更新的lscpu方法更符合我的期望。
slm

实际上,字节序比单词大小更容易确定,因为您将很难找到既不是小尾数也不是大尾数的平台(至少对于整数,浮点数是另一回事),而存在很多混合在32位和64位之间(CPU,内核,用户区,给定进程)。
吉尔(Gilles)'所以

@Gilles-是的,因为我主要是在Solaris或Linux上长大的,所以我对世界的看法可能会减弱。没有那么多。
slm

od方法应该适用于大多数开放系统,而不仅限于Linux,使用using就是这种情况lscpu。因此,什么是“最佳”取决于情况。
MattBianco 2014年

Answers:


40

lscpu

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

Byte Order:            Little Endian

已知可以运行的系统

  • 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,以下输出显示了差异:

工具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网站下载的。


谢谢大卫,当我拿起那个文件时,我很想念那个。一定要瞎了8
slm

我明白为什么我错过了。我的Fedora 14系统lscpu没有显示该值,但是我的Ubuntu 12.10系统显示了该值。如果您不介意,我可能会回答您,并将其分为不同系统的各个部分以及在每个系统上的处理方式。
slm

@slm当然,继续。供参考,也lscpu可以在Archlinux上使用。
大卫·布拉格曼 David Baggerman),2013年

哪个版本的Arch?
slm

Arch没有版本;这是一个滚动发布...
jasonwryan

6

我在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

6

使用python

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

要么:

printf '\1' | od -dAn
1

1小字节序和00256大字节序在哪里。

或使用较短的perl版本:

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

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

1

如果您使用的系统没有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;
}

对VAX中端没有什么爱?
thrig

很好发现,我对当前的Intel-> PowerPC问题非常着迷,没有想到那么可怕的事情。
马修五世凯里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.