如何判断 Linux 系统是大端还是小端?

Jak*_*son 110 central-processing-unit

我知道某些处理器是 Big Endian,而其他处理器是 Little Endian。但是是否有命令、bash 脚本、python 脚本或一系列命令可以在命令行中使用来确定系统是 Big Endian 还是 Little Endian?就像是:

if <some code> then
    echo Big Endian
else
    echo Little Endian
fi
Run Code Online (Sandbox Code Playgroud)

还是仅确定系统正在使用的处理器并使用它来确定其 Endianess 是否更简单?

kri*_*ssi 131

在大端系统上(SPARC 上的 Solaris)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 
Run Code Online (Sandbox Code Playgroud)

0

在小端系统上(x86 上的 Linux)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 
Run Code Online (Sandbox Code Playgroud)

1


上面的解决方案很聪明,非常适合 Linux *86 和 Solaris Sparc。

我需要一个也适用于 AIX/Power 和 HPUX/Itanium 的纯 shell(无 Perl)解决方案。不幸的是,最后两个不太好:AIX 报告“6”,HPUX 给出一个空行。

使用您的解决方案,我能够制作出适用于所有这些 Unix 系统的东西:

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

关于某人发布的 Python 解决方案,它在 Jython 中不起作用,因为 JVM 将所有内容都视为 Big。如果有人可以让它在 Jython 中工作,请发帖!

另外,我发现了这个,它解释了各种平台的字节序。根据操作系统选择的内容,某些硬件可以在任一模式下运行:http : //labs.hoffmanlabs.com/node/544


如果您打算使用 awk,这一行可以简化为:

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

对于没有“od”的小型 Linux 机器(比如 OpenWrt),请尝试“hexdump”:

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

  • 愿意解释一下它是如何工作的吗? (3认同)
  • 顺便说一下,这是大写的“I”(眼睛)而不是小写的“l”(ell)。 (2认同)

dot*_*hen 52

如果您使用的是相当新的 Linux 机器(大多数是 2012 年之后的机器),那么lscpu现在包含以下信息:

$ lscpu | grep Endian
Byte Order:            Little Endian
Run Code Online (Sandbox Code Playgroud)

这是lscpu在 2.19 版本中添加的,该版本可在 Fedora >= 17、CentOS >= 6.0、Ubuntu >= 12.04 中找到。

请注意,我从Unix.SE 上的这个很棒的答案中找到了这个答案。那个答案有很多相关信息,这篇文章只是它的一个总结。


小智 33

这是一个更优雅的python单行脚本

python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"
Run Code Online (Sandbox Code Playgroud)

退出代码0表示大端和1小端

或者只是改变sys.exitprint的打印输出

  • 这不适用于运行 Python 2.4.x 的 RHEL 5.x/CentOS 5.x 系统。这是一个修复:`python -c "import sys;sys.exit(int(sys.byteorder!='big'))"` (4认同)

小智 12

您可以利用 ELF 文件格式来确定系统的字节序。例如,以十六进制打印任意 ELF 文件的前六个字节:

xxd -c 1 -l 6 /bin/ls

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

如果最后一行(六字节)是 01,根据ELF 格式,01 是小端,02 是大端。

如果你xxd的盒子上没有(并且有busybox),试试这个:

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


slm*_*slm 10

可以使用awk以下方法稍微简化主要答案:

在 Big Endian 系统上(Solaris、SPARC)

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

在 Little Endian 系统上(Linux、Intel)

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

较新的 Linux 内核

从 util-linux 包的 2.19 版lscpu开始,该命令开始包含与 Endianness 相关的字段。所以现在你可以简单地使用这个命令来找出这个:

$ lscpu | grep -i byte
Byte Order:            Little Endian
Run Code Online (Sandbox Code Playgroud)

这已经在 Ubuntu 12.10 和 CentOS 6 上得到确认。所以我愿意假设大多数 3.0+ Linux 内核现在都提供这个。

在 Debian/Ubuntu 系统上,您也可以使用此命令,但不确定何时可用:

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

参考


Den*_*son 9

这个 Python 脚本应该适合你:

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

  • 一行:`python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('&lt;h',1)))"`。大端的退出代码为 0,小端的退出代码为 1。 (4认同)

小智 8

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

它将打印系统的字节序。