লিনাক্স সিস্টেমটি বড় এন্ডিয়ান বা সামান্য এডিয়ান হয় কীভাবে তা বলবেন?


91

আমি জানি যে কিছু প্রসেসর হলেন বিগ এন্ডিয়ান এবং অন্যরা হলেন লিটল এন্ডিয়ান। তবে এমন কোনও কমান্ড, বাশ স্ক্রিপ্ট, পাইথন স্ক্রিপ্ট বা কমান্ডের সিরিজ রয়েছে যা কমান্ড লাইনে ব্যাগ এন্ডিয়ান বা লিটল এন্ডিয়ান কিনা তা নির্ধারণের জন্য ব্যবহার করা যেতে পারে? কিছুটা এইরকম:

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

অথবা সিস্টেমটি কোন প্রসেসরটি ব্যবহার করছে তা নির্ধারণ করা এবং এর শেষত্ব নির্ধারণের জন্য এটির সাথে যেতে আরও সহজ?


পার্ল ব্যবহার করে সমাধানটি এখানে দেওয়া হয়েছে: 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 এবং সোলারিস স্পার্কের জন্য দুর্দান্ত কাজ করে।

আমার শেল-ওনল (পার্ল নন) সমাধান দরকার যা এআইএক্স / পাওয়ার এবং এইচপিইউএক্স / ইটানিয়ামেও কাজ করে। দুর্ভাগ্যক্রমে শেষ দুটি দুর্দান্ত খেলছে না: এআইএক্স "6" রিপোর্ট করে এবং এইচপিইউক্স একটি খালি লাইন দেয়।

আপনার সমাধানটি ব্যবহার করে, আমি এমন কিছু কারুকাজ করতে সক্ষম হয়েছি যা এই সমস্ত ইউনিক্স সিস্টেমে কাজ করেছে:

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

পাইথন সমাধানের বিষয়ে যে কেউ পোস্ট করেছে, এটি জাইথনে কাজ করে না কারণ জেভিএম সবকিছুকে বিগ হিসাবে বিবেচনা করে। যদি কেউ এটি জাইথনে কাজ করতে পারেন তবে পোস্ট করুন!

এছাড়াও, আমি এটি পেয়েছি, যা বিভিন্ন প্ল্যাটফর্মের অন্তর্নিহিততার ব্যাখ্যা করে। ও / এস যা পছন্দ করে তার উপর নির্ভর করে কিছু হার্ডওয়্যার দুটি মোডে কাজ করতে পারে: http://labs.hoffmanlabs.com/node/544


আপনি যদি জঞ্জাল ব্যবহার করতে চলেছেন তবে এই লাইনটি এখানে সরল করা যেতে পারে:

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

ছোট লিনাক্স বাক্সগুলির জন্য যার 'ওড' নেই (ওপেনওআর্ট বলুন) তারপরে 'হেক্সডাম্প' চেষ্টা করুন:

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

2
এটি উপায় দ্বারা Iনিম্ন-কেস l(এল) না করে একটি উচ্চ-কেস (চোখ) ।
ডেনিস উইলিয়ামসন

1
(সোলারিস) -> (সোলারিস, স্পার্ক), যদিও স্পার্ক> = ভি 9 দ্বি এন্ডিয়ান।
ক্রিশ্চিয়ান সিউপিতু

1
এটি কিভাবে কাজ করে তা বোঝানোর জন্য যত্নশীল?
ম্যাসিমো

এটি অ্যান্ড্রয়েডে (নেক্সাস 5) কাজ করবে বলে মনে হচ্ছে না। নিশ্চিত কেন নয় ...
wjandrea

printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
কাজ

35

আপনি যদি মোটামুটি সাম্প্রতিক লিনাক্স মেশিনে থাকেন ( তবে 2012 এর পরে বেশিরভাগ কিছুই) তবে lscpuএখন এই তথ্যটি অন্তর্ভুক্ত রয়েছে:

$ lscpu | grep Endian
Byte Order:            Little Endian

এটি lscpu2.19 সংস্করণে যুক্ত করা হয়েছিল , যা ফেডোরা> = 17, সেন্টোস> = 6.0, উবুন্টু> = 12.04 এ পাওয়া যায়।

নোট করুন যে আমি এই উত্তরটি ইউনিক্স.এসই-তে ভয়ঙ্কর উত্তর থেকে পেয়েছি । এই উত্তরে প্রচুর প্রাসঙ্গিক তথ্য রয়েছে, এই পোস্টটি এটির কেবল একটি সংক্ষিপ্তসার।


31

এখানে আরও মার্জিত অজগর এক-লাইন স্ক্রিপ্ট

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

প্রস্থান কোড 0মানে বড় এন্ডিয়ান এবং এর 1অর্থ সামান্য এন্ডিয়ান

বা শুধু পরিবর্তন sys.exitকরার printএকটি মুদ্রণযোগ্য আউটপুট


4
পাইথন ২.৪.এক্স চলমান আরএইচএল 5..x / সেন্টোজ 5..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

আরও নতুন লিনাক্স কার্নেলস

ইউজ-লিনাক্স প্যাকেজের সংস্করণ ২.১৯ অনুসারে কমান্ডটি lscpuএন্ডিয়নেস সম্পর্কিত একটি ক্ষেত্র অন্তর্ভুক্ত করেছিল। সুতরাং এখন এটি সন্ধান করার জন্য আপনি কেবল এই আদেশটি ব্যবহার করতে পারেন:

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

এটি উবুন্টু ১২.১০ এবং সেন্টোস on এ নিশ্চিত করা হয়েছে। সুতরাং আমি ধরে নিতে চাই যে বেশিরভাগ 3.0+ লিনাক্স কার্নেলগুলি এখন এটি সরবরাহ করছে offering

ডেবিয়ান / উবুন্টু সিস্টেমে আপনি এই কমান্ডটিও ব্যবহার করতে পারেন, এটি কখন উপলব্ধ হবে তা নিশ্চিত নয়:

$ 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

আপনার সিস্টেমের শেষতা নির্ধারণ করতে আপনি ইএলএফ ফাইল ফর্ম্যাটটির সুবিধা নিতে পারেন। উদাহরণস্বরূপ, হেক্সে একটি স্বেচ্ছাসেবী ইএলএফ ফাইলের প্রথম ছয়টি বাইট মুদ্রণ করুন:

xxd -c 1 -l 6 /bin/ls

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

ELF ফর্ম্যাট অনুসারে শেষ লাইনটি (ছয়টি বাইট) যদি 01 হয় তবে 01 সামান্য এন্ডিয়ান এবং 02 বড় এন্ডিয়ান।

আপনি যদি xxdআপনার বাক্সে কিছু না পেয়ে থাকেন (এবং ব্যস্তবক্সে থাকে) তবে এটি ব্যবহার করে দেখুন:

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


আমি মনে করি আপনি একটি স্বেচ্ছাচারী ইএলএফ বোঝাতে চাইছেন ... যেহেতু শেল স্ক্রিপ্টস, পারল, পাইথন ইত্যাদি সহ অন্যান্য নির্বাহযোগ্য প্রকারভেদ রয়েছে তাই অন্যথায় আপনি ভুল বলছেন না - কেবল এটি বলার অপেক্ষা রাখে যে অন্যান্য নির্বাহী প্রকারের (এবং আগ্রহের জন্য কোড পাঠ্য বিভাগে রয়েছে তাই পুরাতন পাঠ্য ফাইল ব্যস্ত ত্রুটি)।
প্রাইফটান

1
@ প্রিফটান এটি উল্লেখ করার জন্য ধন্যবাদ। সংশোধন!
টং চাউ

@ টংজহউ স্বাগতম! সাহায্য হতে পেরে আনন্দিত!
প্রাইফটান

অসাধারণ! ব্যস্তবক্স-ভিত্তিক এমবেডড ওএসের জন্য কাজ করার প্রথম পদ্ধতি।
ogurets

3

জাইথনে এটি করার একটি উপায় আমি পেয়েছি। যেহেতু জাইথন ​​(জেভিএম-তে পাইথন) কোনও ভিএম-তে চালিত হয় তাই এটি হার্ডওয়ার নির্বিশেষে সর্বদা বড় এন্ডিয়ান প্রতিবেদন করে।

এই সমাধানটি লিনাক্স, সোলারিস, এআইএক্স এবং এইচপিইউক্সের জন্য কাজ করে। উইন্ডোজ পরীক্ষা করা হয়নি:

    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, দুঃখিত;)
এফ

1
এটি আগের উত্তর হিসাবে ঠিক একই পদ্ধতি , যা আপনার চেয়ে আরও বিশদ সরবরাহ করে than
ক্যাস্পার্ড

0

সামান্য ভিন্ন প্রয়োজন: কোড নির্বাহ না করেই কম্পাইল টার্গেট মেশিনটি বিট বা সামান্য এন্ডিয়ান কিনা তা নির্ধারণ করতে আমার একটি প্রোগ্রাম বিল্ড কনফিগার স্ক্রিপ্টে এর মতো একটি পরীক্ষা প্রয়োজন । স্ক্রিপ্ট অবশ্যই একটি শিরোনামে জমা দিতে হবে , অন্যথায় ।#define HAVE_LITTLE_ENDIAN 1config.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ঘটে তবে এটি বড়-এন্ডিয়ান। যদি স্ট্রিং না ঘটে বা আরও আশ্চর্যজনকভাবে উভয়ই ঘটে তবে পরীক্ষা ব্যর্থ হয়েছে।

এই পদ্ধতিটি কাজ করে কারণ প্রোগ্রামে গণনা করা "ফোরসিসি" ধ্রুবকের মেশিন-স্বতন্ত্র মান রয়েছে, সমাপ্তি নির্বিশেষে একই পূর্ণসংখ্যাকে বোঝায়। বস্তুর ফাইলে তাদের স্টোরেজ উপস্থাপনা লক্ষ্য সিস্টেমের endianness অনুসরণ করে, এবং যে অধীন চরিত্র ভিত্তিক দৃশ্য মাধ্যমে দৃশ্যমান strings

দুটি শূন্য রক্ষাকারী শব্দটি নিশ্চিত করে যে স্ট্রিংটি বিচ্ছিন্ন। এটি কঠোরভাবে প্রয়োজনীয় নয়, তবে এটি নিশ্চিত করে যে আমরা যে স্ট্রিংটির সন্ধান করছি সেগুলি অন্য কোনও স্ট্রিংয়ে এম্বেড করা হয়নি, যার অর্থ stringsএটি নিজেই একটি লাইনে আউটপুট তৈরি করবে।

পিএস USPELLম্যাক্রো যুক্তি সন্নিবেশগুলিকে বন্ধনীয় করে না কারণ এটি এই নির্দিষ্ট উদ্দেশ্যে তৈরি করা হয়েছে, পুনরায় ব্যবহারের জন্য নয়।


এটি নয় যে সমস্ত প্রকল্পের জন্য এটি প্রয়োজনীয় তবে অটোকনফ / অটোমেকের কি এই চেকটি নেই? আমার প্রকল্পগুলি সর্বদা যথেষ্ট ছোট যেখানে আমি নিজের মেকফিলগুলি তৈরি করতে পারি (যদিও সবসময় বেসিক না) তাই প্রয়োজনীয়তার সাথে কিছু পরিবর্তন এবং সাধারণ ইন্টারফেস ছাড়া আমি সেই সরঞ্জামগুলি সত্যিই জানি না..কিন্তু যদি তাদের সনাক্তকরণ থাকে তবে আমি অবাক হই। এটি করার পরেও সম্ভবত আপনার এটির প্রয়োজন ছিল না, কেবল ভেবেছিলাম আমি সম্ভাবনাটি ফেলে দেই।
প্রাইফটান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.