Pertanyaan Bagaimana cara mengetahui apakah sistem Linux adalah endian besar atau endian kecil?


Saya tahu bahwa prosesor tertentu adalah Big Endian dan yang lainnya adalah Little Endian. Tetapi apakah ada perintah, skrip bash, skrip python atau serangkaian perintah yang dapat digunakan pada baris perintah untuk menentukan apakah suatu sistem adalah Big Endian atau Little Endian? Sesuatu seperti:

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

Atau lebih mudah untuk hanya menentukan prosesor apa yang digunakan sistem dan menggunakannya untuk menentukan Endianess-nya?


82
2017-07-23 16:58




Berikut solusinya menggunakan perl: stackoverflow.com/questions/2610849/... - slu


Jawaban:


Pada Sistem Besar Endian (Solaris di SPARC)

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

0

Pada sistem endian kecil (Linux pada x86)

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

1


Solusi di atas pintar dan berfungsi baik untuk Linux * 86 dan Solaris Sparc.

Saya membutuhkan solusi shell-only (no Perl) yang juga bekerja pada AIX / Power dan HPUX / Itanium. Sayangnya dua yang terakhir tidak bermain bagus: AIX melaporkan "6" dan HPUX memberikan garis kosong.

Menggunakan solusi Anda, saya bisa membuat sesuatu yang bekerja pada semua sistem Unix ini:

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

Mengenai solusi Python yang diposting seseorang, itu tidak bekerja di Jython karena JVM memperlakukan semuanya sebagai Big. Jika ada yang bisa membuatnya bekerja di Jython, silakan posting!

Juga, saya menemukan ini, yang menjelaskan endianness dari berbagai platform. Beberapa perangkat keras dapat beroperasi dalam mode baik tergantung pada apa yang dipilih O / S: http://labs.hoffmanlabs.com/node/544


Jika Anda akan menggunakan awk, baris ini dapat disederhanakan menjadi:

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

Untuk kotak-kotak Linux kecil yang tidak memiliki 'od' (katakanlah OpenWrt) kemudian coba 'hexdump':

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

102
2017-07-23 17:04



Itu huruf besar I (mata) daripada huruf kecil l (ell) ngomong-ngomong. - Dennis Williamson
(Solaris) -> (Solaris, Sparc), meskipun Sparc> = V9 adalah bi endian. - Cristian Ciupitu
Mau menjelaskan cara kerjanya? - Massimo
Ini sepertinya tidak berfungsi di Android (Nexus 5). Tidak yakin kenapa ... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


Berikut ini skrip satu baris yang lebih elegan

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

kode keluar 0 berarti big endian dan 1 berarti little endian

atau hanya berubah sys.exit untuk print untuk hasil cetak


29
2018-05-21 20:26



Ini tidak akan berfungsi pada sistem RHEL 5.x / CentOS 5.x yang menjalankan Python 2.4.x. Berikut ini perbaikannya: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


Jika Anda berada di mesin Linux yang cukup baru (apa pun setelah 2012) kemudian lscpu sekarang berisi informasi ini:

$ lscpu | grep Endian
Byte Order:            Little Endian

Ini ditambahkan ke lscpu di versi 2.19, yang ditemukan di Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.

Perhatikan bahwa saya menemukan jawaban ini dari jawaban hebat ini di Unix.SE. Jawaban itu memiliki banyak informasi yang relevan, posting ini hanyalah ringkasannya.


26
2018-06-15 11:26





Jawaban utama dapat disederhanakan menggunakan sedikit awk:

Pada sistem Big Endian (Solaris, SPARC)

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

Pada sistem Little Endian (Linux, Intel)

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

Kernel Linux yang Lebih Baru

Mulai dari versi 2.19 dari paket util-linux perintah lscpu mulai termasuk bidang yang terkait dengan Endianness. Jadi sekarang Anda dapat menggunakan perintah ini untuk mengetahui hal ini:

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

Ini telah dikonfirmasi pada Ubuntu 12.10 dan CentOS 6. Jadi saya akan berasumsi bahwa kebanyakan kernel Linux 3.0+ sekarang menawarkan ini.

Pada sistem Debian / Ubuntu Anda juga dapat menggunakan perintah ini, tidak yakin kapan itu tersedia:

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

Referensi


10
2017-08-30 23:41





Skrip Python ini seharusnya bekerja untuk Anda:

#!/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



Satu liner: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". Kode keluarnya adalah 0 untuk big endian dan 1 untuk little endian. - Cristian Ciupitu
Ha! Cukup rapi! Terima kasih teman-teman! - Viet


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

Itu akan mencetak endianess sistem.


6
2018-05-28 07:17





Saya menemukan cara untuk melakukannya di Jython. Karena Jython (Python pada JVM) berjalan pada VM, ia selalu melaporkan big endian, terlepas dari perangkat kerasnya.

Solusi ini berfungsi untuk Linux, Solaris, AIX, dan HPUX. Belum diuji pada Windows:

    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





Anda dapat memanfaatkan format file ELF untuk menentukan endianness sistem Anda. Sebagai contoh, cetak enam byte pertama dari file ELF arbitrer dalam hex:

xxd -c 1 -l 6 /bin/ls

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

Jika baris terakhir (byte keenam) adalah 01, menurut Format ELF, 01 adalah little endian dan 02 adalah big endian.


3
2018-01-15 18:23



Ini adalah persis apa yang saya butuhkan. Terima kasih! - Vasily G
Saya pikir maksud Anda dari ELF yang sewenang-wenang ... Karena ada jenis lain yang dapat dieksekusi termasuk skrip shell, perl, python, dll. Tidak mengatakan Anda salah sebaliknya - hanya mengatakan bahwa perlu diingat bahwa ada jenis lain yang dapat dieksekusi (dan untuk menarik kode berada di segmen teks maka file lama sibuk file kesalahan). - Pryftan
@Pryftan Terima kasih telah menunjukkannya. Dikoreksi itu! - Tong Zhou
@TongZhou Selamat datang; senang bisa membantu! - Pryftan


Perintah satu baris berdasarkan format ELF:
hexdump -s 5 -n 1 /bin/sh


0
2018-04-01 11:36



Edit: -n 1, maaf;) - fae
Ini adalah metode yang sama persis seperti jawaban sebelumnya, yang juga menyediakan lebih banyak detail daripada milik Anda. - kasperd