我知道某些处理器是 Big Endian,而其他处理器是 Little Endian。但是是否有命令、bash 脚本、python 脚本或一系列命令可以在命令行中使用来确定系统是 Big Endian 还是 Little Endian?例如:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
或者更简单的是仅确定系统正在使用什么处理器并以此来确定它的字节序?
答案1
在 Big Endian 系统上(SPARC 上的 Solaris)
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
0
在小端系统上(x86 上的 Linux)
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
1
上述解决方案非常巧妙,并且非常适合 Linux *86 和 Solaris Sparc。
我需要一个只使用 shell(不使用 Perl)的解决方案,该解决方案还适用于 AIX/Power 和 HPUX/Itanium。不幸的是,后两者运行效果不佳: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}'
对于没有“od”的小型 Linux 机器(比如 OpenWrt),请尝试“hexdump”:
echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'
答案2
如果你使用的是较新的 Linux 机器(2012 年之后的大部分内容)然后lscpu
现在包含此信息:
$ lscpu | grep Endian
Byte Order: Little Endian
这是在 2.19 版本中添加的功能lscpu
,可以在 Fedora >= 17、CentOS >= 6.0、Ubuntu >= 12.04 中找到。
请注意,我找到了这个答案Unix.SE 上的这个精彩答案。那个答案有很多相关信息,这篇文章只是对其进行了总结。
答案3
这是一个更优雅的python单行脚本
python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"
退出代码0
表示大端序,1
表示小端序
或者直接更改sys.exit
为print
可打印输出
答案4
主要答案可以稍微简化一下awk
:
在 Big Endian 系统上(Solaris、SPARC)
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0
在 Little Endian 系统上(Linux、Intel)
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1
较新的 Linux 内核
从 util-linux 软件包 2.19 版开始,该命令lscpu
开始包含与字节序相关的字段。因此,现在您只需使用此命令即可找到它:
$ lscpu | grep -i byte
Byte Order: Little Endian
这已在 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