سؤال كيف يمكن معرفة ما إذا كان نظام لينكس نظامًا إنجيًا كبيرًا أو قليلًا؟


وأنا أعلم أن بعض المعالجات هي بيغ انديان وآخرون هم القليل Endian. ولكن هل هناك أمر ، أو برنامج نصي bash ، أو python script ، أو سلسلة من الأوامر التي يمكن استخدامها في سطر الأوامر لتحديد ما إذا كان النظام هو Endian أو Endian صغير؟ شيء مثل:

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

أم هو أكثر بساطة لتحديد ما هو المعالج الذي يستخدمه النظام وتذهب مع ذلك لتحديد Endianess؟


82
2017-07-23 16:58


الأصل


إليك الحل باستخدام perl: stackoverflow.com/questions/2610849/... - slu


الأجوبة:


في نظام Endian-System (Solaris على SPARC)

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

0

على نظام endian قليلا (Linux على x86)

$ 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 خطًا فارغًا.

باستخدام الحل الخاص بك ، تمكنت من صياغة شيء يعمل على جميع أنظمة يونكس هذه:

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

فيما يتعلق بحل بايثون الذي نشره شخص ما ، فإنه لا يعمل في جايثون لأن JVM يعامل كل شيء على أنه كبير. إذا كان بإمكان أي شخص الحصول عليها للعمل في جايثون ، فيرجى النشر!

أيضا ، لقد وجدت هذا ، وهو ما يفسر endianness من مختلف المنصات. يمكن أن تعمل بعض الأجهزة في أي من الوضعين وفقًا لما يحدده 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}'

102
2017-07-23 17:04



هذا هو الحاله العليا I (العين) بدلا من حالة صغيرة l (ell) بالمناسبة. - Dennis Williamson
(Solaris) -> (Solaris ، Sparc) ، على الرغم من Sparc> = V9 هو endian endian. - Cristian Ciupitu
تهتم بشرح كيف يعمل؟ - Massimo
يبدو أن هذا لا يعمل على Android (Nexus 5). غير متأكد من السبب... - wjandrea
printf "\x1" | od -to2 | awk 'NR==1{print$2==1}' - Kaz


هنا هو السيناريو بيثون سطر واحد أكثر أناقة

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

رمز الخروج 0 يعني نهاية كبيرة و 1 يعني القليل من endian

أو مجرد تغيير sys.exit إلى print للحصول على إخراج قابل للطباعة


29
2018-05-21 20:26



لن يعمل هذا على أنظمة RHEL 5.x / CentOS 5.x التي تقوم بتشغيل Python 2.4.x. وإليك الإصلاح: python -c "import sys;sys.exit(int(sys.byteorder!='big'))" - JPaget


إذا كنت تستخدم جهاز Linux حديثًا إلى حد ما (معظم شيء بعد عام 2012) ثم lscpu يحتوي الآن على هذه المعلومات:

$ lscpu | grep Endian
Byte Order:            Little Endian

تمت إضافة هذا إلى lscpu في الإصدار 2.19 ، الذي تم العثور عليه في فيدورا> = 17 ، CentOS> = 6.0 ، أوبونتو> = 12.04.

لاحظ أنني وجدت هذه الإجابة من هذه الإجابة الرائعة على Unix.SE. تحتوي هذه الإجابة على الكثير من المعلومات ذات الصلة ، وهذه المشاركة مجرد ملخص لها.


26
2018-06-15 11:26





يمكن تبسيط الإجابة الرئيسية باستخدام قليلا awk:

على نظام Big Endian (سولاريس ، 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

أحدث لينكس النواة

اعتبارا من الإصدار 2.19 من حزمة الاستخدام لينكس الأمر lscpu بدأ بما في ذلك حقل متعلق بـ Endianness. الآن يمكنك ببساطة استخدام هذا الأمر للعثور على ذلك:

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

لقد تم تأكيد ذلك على أوبونتو 12.10 و سينت أو إس 6. لذا سأكون على استعداد لأن أفترض أن معظم 3.0 + لينكس نواة تقدم الآن هذا.

في أنظمة Debian / Ubuntu ، يمكنك أيضًا استخدام هذا الأمر ، وليس متأكدًا من وقت إتاحته:

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

المراجع


10
2017-08-30 23:41





يجب أن يعمل هذا البرنامج النصي Python لك:

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



بطانة واحدة: python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))". رمز الإنهاء هو 0 لـ endian كبير و 1 لـ endian صغير. - Cristian Ciupitu
ها! أنيق جدا! شكرا يا شباب! - Viet


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

سوف يطبع endianess النظام.


6
2018-05-28 07:17





لقد وجدت طريقة لفعل ذلك في جايثون. نظرًا لأن Jython (Python on the JVM) يعمل على جهاز VM ، فإنه دائمًا ما يُبلغ عن نظام endian كبير ، بغض النظر عن الجهاز.

يعمل هذا الحل مع Linux و Solaris و AIX و HPUX. لم تختبر على نظام 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





يمكنك الاستفادة من تنسيق ملف 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 ، وفقًا لـ تنسيق ELF، 01 هو endian قليلا و 02 هي endian كبيرة.


3
2018-01-15 18:23



هذا هو بالضبط ما احتاجه شكر! - Vasily G
أعتقد أنك تقصد ELF تعسفي ... بما أن هناك أنواع أخرى قابلة للتنفيذ بما في ذلك نصوص shell ، perl ، python ، إلخ. لم تقل أنك مخطئ بخلاف ذلك - مجرد القول أنه من المفيد تذكر أن هناك أنواع أخرى قابلة للتنفيذ (و لاهتمام الرمز في جزء النص ومن ثم خطأ مشغول ملف النص القديم). - Pryftan
Pryftan شكرًا على الإشارة إلى ذلك. تصحيحها! - Tong Zhou
TongZhou سعيد أن أكون من المساعدة! - Pryftan