Soru Bir Linux sisteminin büyük bir endian mı yoksa küçük bir endian mı olduğunu nasıl anlayacaksınız?


Bazı işlemcilerin Big Endian ve diğerlerinin Little Endian olduğunu biliyorum. Ama bir sistem Big Endian veya Little Endian olup olmadığını belirlemek için komut satırında kullanılabilecek bir komut, bash betiği, python betiği veya komut dizileri var mı? Gibi bir şey:

if <some code> then
    echo Big Endian
else
    echo Little Endian
fi

Veya sistemin hangi işlemciyi kullandığını belirlemek ve Endianess'i belirlemek için bununla gitmek daha mı basit?


82
2017-07-23 16:58


Menşei


İşte perl kullanarak çözüm: stackoverflow.com/questions/2610849/... - slu


Cevaplar:


Büyük bir Endian Sisteminde (SPARC'de Solaris)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

0

Küçük bir endian sistemde (Linux'ta x86)

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 

1


Yukarıdaki çözüm zekice ve Linux * 86 ve Solaris Sparc için harika çalışıyor.

AIX / Power ve HPUX / Itanium üzerinde çalışan bir kabuk (sadece Perl) çözümüne ihtiyacım vardı. Ne yazık ki son ikisi de iyi oynamıyor: AIX "6" rapor ediyor ve HPUX boş bir satır veriyor.

Çözümünüzü kullanarak, tüm bu Unix sistemlerinde çalışan bir şeyleri üretebildim:

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

Birinin yayınladığı Python çözümü ile ilgili olarak, JVM'de her şey Büyük olarak ele alındığı için Jython'da çalışmaz. Eğer herkes Jython'da çalışmaya başlayabilirse, lütfen gönderin!

Ayrıca, çeşitli platformların enderliğini açıklayan bunu buldum. Bazı donanımlar, O / S'nin seçtiği şeye bağlı olarak her iki modda çalışabilir: http://labs.hoffmanlabs.com/node/544


Eğer awk kullanacaksanız bu satır basitleştirilebilir:

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

'Od' olmayan (“OpenWrt”) küçük Linux kutuları için 'hexdump' deneyin:

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

102
2017-07-23 17:04



Bu büyük bir dava I küçük bir vaka yerine (göz) l (ell) bu arada. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), ancak Sparc> = V9 iki uçludur. - Cristian Ciupitu
Nasıl çalıştığını açıklamak ister misiniz? - Massimo
Bu Android üzerinde çalışmıyor gibi görünüyor (Nexus 5). Emin değilim neden... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


İşte daha şık bir python tek satırlık betik

python -c "import sys;sys.exit(0 if sys.byteorder=='big' else 1)"

çıkış kodu 0 büyük endian ve 1 küçük endian anlamına gelir

ya da sadece değiştir sys.exit için print yazdırılabilir çıktı için


29
2018-05-21 20:26



Bu, Python 2.4.x sürümünü çalıştıran RHEL 5.x / CentOS 5.x sistemlerinde çalışmaz. İşte bir düzeltme: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Oldukça yeni bir Linux makinesindeyseniz (2012'den sonra çoğu şey) sonra lscpu şimdi şu bilgileri içerir:

$ lscpu | grep Endian
Byte Order:            Little Endian

Bu eklendi lscpu Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04'te bulunan 2.19 sürümünde.

Bu cevabı buldum. Unix.SE üzerinde bu müthiş cevap. Bu cevabın pek çok alakalı bilgisi var, bu yazı sadece bir özetidir.


26
2018-06-15 11:26





Ana cevap biraz kullanarak basitleştirilebilir awk:

Büyük bir Endian sisteminde (Solaris, SPARC)

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

Küçük bir Endian sisteminde (Linux, Intel)

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

Daha yeni Linux çekirdekleri

Util-linux paketinin 2.19 sürümünden itibaren komut lscpu Endianness ile ilgili bir alan oluşturmaya başladı. Yani şimdi bunu bulmak için şu komutu kullanabilirsiniz:

$ lscpu | grep -i byte
Byte Order:            Little Endian

Bu, Ubuntu 12.10 ve CentOS 6'da onaylandı. Bu yüzden, çoğu 3.0+ Linux Kerneli'nin bunu şimdi sunduğunu varsaymak isterim.

Debian / Ubuntu sistemlerinde bu komutu, ne zaman kullanıma sunulduğundan emin olmadan da kullanabilirsiniz:

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little

Referanslar


10
2017-08-30 23:41





Bu Python betiği sizin için çalışmalıdır:

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

9
2017-07-23 17:28



Bir astar: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". Çıkış kodu büyük endian için 0 ve az endian için 1'dir. - Cristian Ciupitu
Ha! Oldukça düzgün! Teşekkürler beyler! - Viet


python -c "import sys; print(sys.byteorder)"

Sistemin endüsüsünü basardı.


6
2018-05-28 07:17





Jython'da yapmanın bir yolunu buldum. Jython (JVM'deki Python) bir VM üzerinde çalıştığı için, donanımdan bağımsız olarak her zaman büyük endian bildirir.

Bu çözüm Linux, Solaris, AIX ve HPUX için çalışır. Windows'da test etmediniz:

    from java.lang import System
    for property, value in dict(System.getProperties()).items():
        if property.endswith('cpu.endian'):
            return value

3
2017-11-30 22:40