প্রশ্ন কিভাবে একটি লিনাক্স সিস্টেম বড় 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


উত্তর:


একটি বিগ এন্ডিয়ান-সিস্টেমে (SPARC এ সোলারিস)

$ 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 / পাওয়ার এবং এইচপিইউএক্স / ইটানিয়ামেও কাজ করেছিল। দুর্ভাগ্যবশত শেষ দুইটি ভাল খেলতে পারে না: AIX প্রতিবেদনগুলি "6" এবং এইচপিইউএক্স একটি খালি লাইন দেয়।

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

$ 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}'

ছোট লিনাক্স বক্সগুলির জন্য যা 'od' নেই (ওপেনওয়ার্ট বলে) তারপর 'hexdump' চেষ্টা করুন:

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

102
2017-07-23 17:04



যে একটি উচ্চ ক্ষেত্রে I (চোখের) বরং একটি নিম্ন ক্ষেত্রে l (ell) উপায় দ্বারা। - Dennis Williamson
(সোলারিস) -> (সোলারিস, স্পার্ক), যদিও স্পার্ক> = V9 দ্বি শেষ হয়। - Cristian Ciupitu
এটা কাজ করে কিভাবে ব্যাখ্যা করতে যত্ন? - Massimo
এটি অ্যান্ড্রয়েড (নেক্সাস 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 বড় endian এবং মানে 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


আপনি যদি সাম্প্রতিকতম লিনাক্স মেশিনে থাকেন (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:

একটি বিগ এন্ডিয়ান সিস্টেমে (সোলারিস, SPARC)

$ 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 Endianness সম্পর্কিত একটি ক্ষেত্র সহ শুরু। তাই এখন আপনি এই কমান্ডটি সহজেই খুঁজে পেতে পারেন:

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

উবুন্টু 12.10 এবং সেটিস 6 এ এটি নিশ্চিত করা হয়েছে। তাই আমি অনুমান করতে চাই যে বেশিরভাগ 3.0+ লিনাক্স কার্নেল এখন এই অফার করছে।

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

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

তথ্যসূত্র


10
2017-08-30 23:41





এই পাইথন স্ক্রিপ্ট আপনার জন্য কাজ করা উচিত:

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





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

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

    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





আপনি আপনার সিস্টেমের endianness নির্ধারণ করতে 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
আমি মনে করি আপনি একটি এলবিএইচ এলএলএফ এর মানে ... শেল স্ক্রিপ্ট, পার্ল, পাইথন ইত্যাদি সহ অন্যান্য এক্সিকিউটেবল ধরনের রয়েছে। অন্যথায় বলার অপেক্ষা রাখে না যে আপনি অন্যরকম ভুল করছেন - তবে শুধু বলছেন যে এটি অন্য উপযুক্ত এক্সিকিউটেবল ধরনের (এবং আগ্রহের জন্য কোড টেক্সট সেগমেন্টে আছে তাই পুরানো পাঠ্য ফাইল ব্যস্ত ত্রুটি)। - Pryftan
@Pryftan যে ইঙ্গিত করার জন্য ধন্যবাদ। এটা ঠিক! - Tong Zhou
@ টংঝো স্বাগতম; সাহায্য হতে পেরে আনন্দিত! - Pryftan


এলএলএফ ফরম্যাটের উপর ভিত্তি করে একটি একক লাইন কমান্ড:
hexdump -s 5 -n 1 /bin/sh


0
2018-04-01 11:36



সম্পাদনা করুন: -1 1, দুঃখিত;) - fae
এটি একটি হিসাবে একই পদ্ধতি পূর্ববর্তী উত্তর, যা আপনার চেয়ে আরও বিস্তারিত প্রদান করে। - kasperd


সামান্য ভিন্ন প্রয়োজন: আমি এই ধরনের একটি পরীক্ষা প্রয়োজন কিনা নির্ধারণ একটি প্রোগ্রাম নির্মাণ স্ক্রিপ্ট নির্মাণ কিনা লক্ষ্য মেশিন কম্পাইল বিট বা সামান্য endian হয়, কোড নির্বাহ ছাড়া। স্ক্রিপ্ট জমা দিতে হবে #define HAVE_LITTLE_ENDIAN 1 একটি মধ্যে config.h হেডার, বা অন্য #define HAVE_LITTLE_ENDIAN 0

কম্পাইল টার্গেট মেশিন বিল্ড মেশিন থেকে আলাদা হতে পারে, যেহেতু আমরা ক্রস-কম্পাইলিং হতে পারি, যা ব্যাখ্যা করে কেন পরীক্ষাটি কোনও সংকলিত কোড চালানোর চেষ্টা করে না। এটি একটি প্রশ্নের সাথে সামান্য সি প্রোগ্রাম আছে একটি printf উত্তর খুঁজে spits যে বিবৃতি।

একটি সম্ভাব্য সমাধান এই হয়। আমরা বলা একটি ফাইল জেনারেট 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 ঘটে, লক্ষ্য সামান্য endian হয়। যদি স্ট্রিং LISPUNIXCOREDWIM ঘটে, এটি বড়-এন্ডিয়ান। যদি না স্ট্রিং হয় বা এমনকি আরো বিস্ময়করভাবে, উভয়, তারপর পরীক্ষা ব্যর্থ হয়েছে।

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

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

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


0
2018-05-26 00:37



এটি সব প্রকল্পের জন্য প্রয়োজনীয় নয় কিন্তু অটোকনফ / automake এই চেক না? আমার প্রকল্পগুলি সর্বদা যথেষ্ট ছোট যেখানে আমি আমার নিজের মেকফিলগুলি (যদিও সর্বদা মৌলিক না) তৈরি করতে পারি। তাই প্রয়োজনীয় এবং সাধারণ ইন্টারফেসে কিছু পরিবর্তন করার পরে আমি সত্যিই সেই সরঞ্জামগুলি জানি না .. তবে আমি সনাক্ত করি যদি তারা সনাক্ত হয়। সম্ভবত আপনি এটি প্রয়োজন না এমনকি যদি প্রয়োজন, শুধু চিন্তা আমি সম্ভাবনা ফেলে দিতে চাই। - Pryftan