Saya tahu bahwa prosesor tertentu adalah Big Endian dan 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 apakah lebih sederhana untuk menentukan prosesor apa yang digunakan sistem dan mengikutinya untuk menentukan Endianessnya?
central-processing-unit
Jake Wilson
sumber
sumber
Jawaban:
Pada Sistem Big Endian (Solaris pada SPARC)
0
Pada sistem endian kecil (Linux pada x86)
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 berfungsi dengan baik: AIX melaporkan "6" dan HPUX memberikan baris kosong.
Menggunakan solusi Anda, saya dapat 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 berfungsi di Jython karena JVM memperlakukan semuanya sebagai Besar. 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 mana pun tergantung pada apa yang O / S pilih: http://labs.hoffmanlabs.com/node/544
Jika Anda akan menggunakan awk, baris ini dapat disederhanakan menjadi:
Untuk kotak Linux kecil yang tidak memiliki 'od' (katakanlah OpenWrt) kemudian coba 'hexdump':
sumber
I
(mata) dan bukan huruf kecill
(ell).printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
Jika Anda menggunakan mesin Linux yang cukup baru (sebagian besar setelah 2012) maka
lscpu
sekarang berisi informasi ini:Ini ditambahkan ke
lscpu
dalam versi 2.19, yang ditemukan di Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.Perhatikan bahwa saya menemukan jawaban ini dari jawaban hebat ini pada Unix.SE . Jawaban itu memiliki banyak informasi yang relevan, posting ini hanyalah ringkasannya.
sumber
Berikut ini adalah skrip satu baris python yang lebih elegan
kode keluar
0
berarti big endian dan1
berarti little endianatau hanya mengubah
sys.exit
keprint
untuk hasil cetaksumber
python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
Jawaban utama dapat disederhanakan sedikit menggunakan
awk
:Pada sistem Big Endian (Solaris, SPARC)
Pada sistem Little Endian (Linux, Intel)
Kernel Linux yang lebih baru
Pada versi 2.19 dari paket util-linux perintah
lscpu
mulai termasuk bidang yang terkait dengan Endianness. Jadi sekarang Anda bisa menggunakan perintah ini untuk mencari tahu: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:
Referensi
sumber
Skrip Python ini bisa digunakan untuk Anda:
sumber
python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))"
. Kode keluar adalah 0 untuk big endian dan 1 untuk little endian.Itu akan mencetak endianess sistem.
sumber
Anda dapat memanfaatkan format file ELF untuk menentukan tingkat kehabisan sistem Anda. Misalnya, cetak enam byte pertama dari file ELF sembarang 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 berenam) adalah 01, menurut format ELF , 01 adalah endian kecil dan 02 adalah big endian.
Jika Anda belum punya
xxd
di kotak Anda (dan punya kotak sibuk), coba ini:hexdump -s 5 -n 1 -C /bin/busybox
sumber
Saya menemukan cara untuk melakukannya di Jython. Karena Jython (Python pada JVM) berjalan pada VM, selalu melaporkan big endian, terlepas dari perangkat kerasnya.
Solusi ini berfungsi untuk Linux, Solaris, AIX, dan HPUX. Belum diuji pada Windows:
sumber
Perintah baris tunggal berdasarkan format ELF:
hexdump -s 5 -n 1 /bin/sh
sumber
Persyaratan yang sedikit berbeda: Saya perlu tes seperti ini dalam program build configure script untuk menentukan apakah mesin target kompilasi sedikit atau sedikit endian, tanpa mengeksekusi kode . Script harus disetor
#define HAVE_LITTLE_ENDIAN 1
keconfig.h
header, atau yang lain#define HAVE_LITTLE_ENDIAN 0
.Mesin target kompilasi mungkin berbeda dari mesin build, karena kami mungkin mengkompilasi silang, yang juga menjelaskan mengapa pengujian tidak boleh mencoba menjalankan kode yang dikompilasi. Adalah tidak mungkin untuk memiliki program C kecil dengan
printf
pernyataan yang mengeluarkan jawabannya.Solusi yang mungkin adalah ini. Kami menghasilkan file bernama
conftest.c
yang berisi ini:Sekarang, kami kompilasi ini untuk
conftest.o
menggunakan:Lalu kita jalankan:
Jika string
PSILXINUEROCMIWD
terjadi, targetnya adalah little-endian. Jika stringLISPUNIXCOREDWIM
terjadi, itu adalah big-endian. Jika tidak ada senar yang muncul atau, yang lebih mengejutkan, keduanya terjadi, maka pengujian gagal.Pendekatan ini bekerja karena konstanta "fourcc" yang dihitung dalam program memiliki nilai mesin-independen, menunjukkan bilangan bulat yang sama terlepas dari endianness. Representasi penyimpanan mereka dalam file objek mengikuti endianness dari sistem target, dan itu terlihat melalui tampilan berbasis karakter di bawah
strings
.Dua kata nol guard memastikan bahwa string terisolasi. Itu tidak sepenuhnya diperlukan, tetapi memastikan bahwa string yang kita cari tidak tertanam dalam beberapa string lain, yang berarti
strings
akan menampilkannya pada sebuah baris dengan sendirinya.PS
USPELL
makro tidak mengurung sisipan argumen karena dibuat untuk tujuan khusus ini, bukan untuk digunakan kembali.sumber