अगर लिनक्स सिस्टम बड़ा एंडियन या थोड़ा एंडियन है तो कैसे बताएं?


91

मुझे पता है कि कुछ प्रोसेसर बिग एंडियन हैं और अन्य लिटिल एंडियन हैं। लेकिन क्या कोई कमांड, बैश स्क्रिप्ट, पाइथन स्क्रिप्ट या कमांड की श्रृंखला है जो कमांड लाइन पर इस्तेमाल किया जा सकता है यह निर्धारित करने के लिए कि क्या सिस्टम बिग एंडियन या लिटिल एंडियन है? कुछ इस तरह:

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

या क्या यह निर्धारित करना अधिक सरल है कि सिस्टम किस प्रोसेसर का उपयोग कर रहा है और इसके एंडियनस को निर्धारित करने के लिए उसके साथ जाना है?


यहाँ perl का उपयोग कर समाधान है: stackoverflow.com/questions/2610849/…
slu

जवाबों:


110

बिग एंडियन-सिस्टम (सोलारिस ऑन स्पार्क)

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

0

थोड़ा एंडियन सिस्टम पर (x86 पर लिनक्स)

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

1


ऊपर का समाधान चतुर है और लिनक्स * 86 और सोलारिस स्पार्क के लिए बढ़िया काम करता है।

मुझे एक शेल-ओनली (नो पर्ल) समाधान की आवश्यकता थी जो AIX / Power और HPUX / Itanium पर भी काम करता है। दुर्भाग्य से अंतिम दो अच्छा नहीं खेलते हैं: AIX रिपोर्ट "6" और एचपीयूएक्स एक खाली लाइन देता है।

आपके समाधान का उपयोग करते हुए, मैं इन सभी यूनिक्स प्रणालियों पर काम करने वाले कुछ को तैयार करने में सक्षम था:

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

किसी ने पोस्ट किए गए पायथन समाधान के बारे में, यह जेथॉन में काम नहीं करता है क्योंकि जेवीएम सब कुछ बड़ा मानता है। अगर किसी को भी ज्यथोन में काम करने के लिए मिल सकता है, तो कृपया पोस्ट करें!

इसके अलावा, मुझे यह मिला, जो विभिन्न प्लेटफार्मों की समाप्ति की व्याख्या करता है। कुछ हार्डवेयर O / S के चयन के आधार पर किसी भी मोड में काम कर सकते हैं: http://labs.hoffmanlabs.com/node/544


यदि आप awk का उपयोग करने जा रहे हैं तो इस लाइन को सरल बनाया जा सकता है:

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

छोटे Linux बक्सों के लिए जिनमें 'od' नहीं है (OpenWrt कहें) तो 'hexdump' आज़माएँ:

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

2
यह एक ऊपरी मामले I(आंख) के बजाय एक कम मामले l(ell) है।
डेनिस विलियमसन

1
(सोलारिस) -> (सोलारिस, स्पार्क), हालांकि स्पार्क> = वी 9 बाय एंडियन है।
क्रिस्टियन सियुपिटु

1
यह समझाने के लिए कि यह कैसे काम करता है?
मैसिमो

यह Android (Nexus 5) पर काम नहीं करता है। यकीन नहीं होता क्यों ...
wjandrea

printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
काज

35

यदि आप काफी हाल ही में लिनक्स मशीन पर हैं (2012 के बाद कुछ भी) तो lscpuअब इसमें यह जानकारी है:

$ lscpu | grep Endian
Byte Order:            Little Endian

यह lscpuसंस्करण 2.19 में जोड़ा गया था , जो फेडोरा> = 17, सेंटोस> = 6.0, उबंटू> = 12.04 में पाया जाता है।

ध्यान दें कि मुझे यह उत्तर Unix.SE के इस भयानक उत्तर से मिला । उस उत्तर में बहुत सारी प्रासंगिक जानकारी है, यह पोस्ट केवल इसका सारांश है।


31

यहाँ एक और अधिक सुरुचिपूर्ण अजगर एक-लाइन स्क्रिप्ट है

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

एग्जिट कोड का 0मतलब बड़ा एंडियन और 1मतलब थोड़ा एंडियन

या सिर्फ बदलने sys.exitके लिए printएक मुद्रण योग्य उत्पादन के लिए


4
यह RHEL 5.x / CentOS 5.x सिस्टम पर काम नहीं करेगा जो पायथन 2.4.x चला रहे हैं। यहाँ एक तय है:python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
जेपीगेट

10

मुख्य उत्तर को थोड़ा उपयोग करके सरल बनाया जा सकता है awk:

बिग एंडियन सिस्टम (सोलारिस, स्पार्क) पर

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

थोड़ा एंडियन सिस्टम (लिनक्स, इंटेल) पर

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

नए लिनक्स कर्नेल

उपयोग-लाइनक्स पैकेज के संस्करण 2.19 के रूप में कमांड lscpuएंडियनस से संबंधित क्षेत्र सहित कमांड शुरू हुआ। तो अब आप इसे जानने के लिए बस इस कमांड का उपयोग कर सकते हैं:

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

यह Ubuntu 12.10 और CentOS 6 पर पुष्टि की गई है। इसलिए मैं यह मानने के लिए तैयार रहूंगा कि अधिकांश 3.0+ लिनक्स कर्नेल अब यह पेशकश कर रहे हैं।

डेबियन / उबंटू सिस्टम पर आप इस कमांड का भी उपयोग कर सकते हैं, यह सुनिश्चित नहीं है कि कब उपलब्ध हो:

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

संदर्भ


9

यह पायथन स्क्रिप्ट आपके लिए काम करना चाहिए:

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

4
एक लाइनर python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))":। निकास कोड बड़े एंडियन के लिए 0 और छोटे एंडियन के लिए 1 है।
२०:५० में क्रिस्टियन सियुपिटु

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

यह सिस्टम के एंडियन को प्रिंट करेगा।


6

आप अपने सिस्टम के एंडियननेस को निर्धारित करने के लिए 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 है, तो 01 थोड़ा एंडियन है और 02 बड़ा एंडियन है।

यदि आपको xxdअपने बॉक्स पर नहीं मिला है (और बिजीबॉक्स है), तो यह कोशिश करें:

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


मुझे लगता है कि आप एक मनमाने ढंग से ईएलएफ के बारे में सोचते हैं ... चूंकि शेल स्क्रिप्ट, पर्ल, पाइथन इत्यादि सहित अन्य निष्पादन योग्य प्रकार हैं, इसलिए नहीं कह रहे हैं कि आप गलत हैं, हालांकि - बस यह कह रहे हैं कि यह याद रखने योग्य है कि अन्य निष्पादन योग्य प्रकार हैं (और रुचि के लिए कोड पाठ खंड में है इसलिए पुरानी पाठ फ़ाइल व्यस्त त्रुटि है)।
प्रिएफ्टन

1
@Pryftan कि बाहर इशारा करने के लिए धन्यवाद। इसे ठीक किया!
टोंग झोउ

@ टोंगझोऊ स्वागत; सहायता करके हमें खुशी होगी!
प्राइफटन

बहुत बढ़िया! बिजीबॉक्स-आधारित एम्बेडेड OSes के लिए काम करने की पहली विधि।
ओवोरेट्स

3

मुझे ज्योन में इसे करने का एक तरीका मिला। चूँकि Jython (PyVon on JVM) एक VM पर चलता है, यह हमेशा हार्डवेयर की परवाह किए बिना बड़े एंडियन की रिपोर्ट करता है।

यह समाधान लिनक्स, सोलारिस, एआईएक्स और एचपीयूएक्स के लिए काम करता है। विंडोज पर परीक्षण नहीं किया है:

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

2

ELF प्रारूप पर आधारित एकल-पंक्ति कमांड:
hexdump -s 5 -n 1 /bin/sh


संपादित करें: -n 1, क्षमा करें;)
fae

1
यह पिछले उत्तर के समान सटीक विधि है , जिसने आपकी तुलना में अधिक विवरण भी प्रदान किया है।
कास्परड

0

थोड़ा अलग आवश्यकता: मुझे यह निर्धारित करने के लिए एक प्रोग्राम की तरह एक परीक्षण की आवश्यकता है कि स्क्रिप्ट को कॉन्फ़िगर करें यह निर्धारित करने के लिए कि क्या संकलित लक्ष्य मशीन बिट या थोड़ा एंडियन है, कोड को निष्पादित किए बिना । स्क्रिप्ट को हेडर #define HAVE_LITTLE_ENDIAN 1में जमा करना होगा config.h, वरना #define HAVE_LITTLE_ENDIAN 0

संकलित लक्ष्य मशीन बिल्ड मशीन से भिन्न हो सकती है, क्योंकि हम क्रॉस-संकलन हो सकते हैं, जो यह भी बताता है कि परीक्षण किसी भी संकलित कोड को चलाने की कोशिश क्यों नहीं करनी चाहिए। यह इस सवाल से printfबाहर है कि एक बयान के साथ थोड़ा सी कार्यक्रम है जो उत्तर को बाहर निकालता है।

एक संभावित समाधान यह है। हम एक फाइल बनाते हैं conftest.cजिसमें यह लिखा होता है:

#define USPELL(C0, C1, C2, C3) \                                             
  ((unsigned) C0 << 24 | \                                              
   (unsigned) C1 << 16 | \                                              
   (unsigned) C2 << 8 | (unsigned) C3)                                       

unsigned x[6] = {                                                       
  0,                                                                         
  USPELL('L', 'I', 'S', 'P'),                                                
  USPELL('U', 'N', 'I', 'X'),                                                
  USPELL('C', 'O', 'R', 'E'),                                                
  USPELL('D', 'W', 'I', 'M'),                                                
  0                                                                          
};

अब, हम इसे conftest.oउपयोग करने के लिए संकलित करते हैं:

$ /path/to/cross-compiling/cc conftest.c -c

फिर हम चलाते हैं:

$ strings conftest.o
PSILXINUEROCMIWD

यदि स्ट्रिंग PSILXINUEROCMIWDहोती है, तो लक्ष्य थोड़ा-सा है। यदि स्ट्रिंग LISPUNIXCOREDWIMहोती है, तो यह बड़ा-एंडियन है। यदि न तो स्ट्रिंग होती है या, और भी आश्चर्यजनक रूप से, दोनों करते हैं, तो परीक्षण विफल हो गया है।

यह दृष्टिकोण काम करता है क्योंकि कार्यक्रम में गणना की गई "फोर सीसी" स्थिरांक में मशीन-स्वतंत्र मूल्य होते हैं, जो अंतर्जात की परवाह किए बिना समान पूर्णांक को दर्शाते हैं। ऑब्जेक्ट फ़ाइल में उनका संग्रहण प्रतिनिधित्व लक्ष्य प्रणाली की समाप्ति का अनुसरण करता है, और जो वर्ण-आधारित दृश्य के तहत दिखाई देता है strings

दो शून्य गार्ड शब्द यह सुनिश्चित करते हैं कि स्ट्रिंग पृथक है। यह कड़ाई से आवश्यक नहीं है, लेकिन यह सुनिश्चित करता है कि हम जिस स्ट्रिंग की तलाश कर रहे हैं, वह किसी अन्य स्ट्रिंग में एम्बेडेड नहीं है, जिसका अर्थ है कि stringsयह स्वयं के लिए एक पंक्ति में आउटपुट करेगा।

PS USPELLमैक्रो तर्क सम्मिलन को छोटा नहीं करता है क्योंकि यह इस विशिष्ट उद्देश्य के लिए तैयार किया गया है, पुन: उपयोग के लिए नहीं।


ऐसा नहीं है कि यह सभी परियोजनाओं के लिए आवश्यक है, लेकिन क्या ऑटोकॉन्फ़ / ऑटोकेक के पास यह चेक नहीं है? मेरी परियोजनाएं हमेशा काफी छोटी होती हैं जहां मैं अपना खुद का मेकफाइल्स बना सकता हूं (हालांकि हमेशा बुनियादी नहीं) इसलिए मैं वास्तव में आवश्यक और सामान्य इंटरफ़ेस के अलावा कुछ संशोधन करने के अलावा उन उपकरणों को नहीं जानता हूं..लेकिन मुझे आश्चर्य है कि अगर उनका पता है। शायद आपको इसकी आवश्यकता नहीं थी भले ही वह ऐसा करता हो, बस मैंने सोचा था कि मैं संभावना को बाहर निकाल दूंगा।
प्रीफटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.