2010-04-14 12 views
6

मैं एक फ़ाइल बाइट-बाय-बाइट पढ़ रहा हूं।बिट ऑर्डरिंग और एंडियंस

उदाहरण के लिए कहें कि मेरे पास यह बाइट है: 0x41 (0100 0001) हेक्स में दर्शाया गया है।

अब, मुझे इस बाइट के पहले तीन बिट्स चाहिए, i.e (010)।

मैं पहले तीन बिट्स निकालने के लिए बिटवाइज तर्क का उपयोग कर सकता हूं, लेकिन मेरा सवाल यह है कि पहले तीन बिट मशीन के अंतहीनता से स्वतंत्र होंगे। (यानी वे 001 नहीं हो सकते हैं)?

धन्यवाद,

+0

बिट्स आमतौर पर दाईं ओर गिने जाते हैं, इसलिए 010 आपके उदाहरण में अंतिम तीन बिट्स होंगे। मैं इसका जिक्र करता हूं क्योंकि मेरा मानना ​​है कि बिट मैनिप्ल्यूशन पर अधिकांश दस्तावेज सबसे कम बिट्स पर विचार करते हैं - बिट्स 1, 2, 4 का प्रतिनिधित्व करते हैं ... - पहली बिट्स बनने के लिए। –

+0

किसी शब्द के अंदर बिट ऑर्डर पर कोई सार्वभौमिक सम्मेलन नहीं है। अभ्यास में, यह निर्भर करता है कि आप इसके लिए क्या उपयोग कर रहे हैं। यदि आप बहुभाषी अंकगणित कर रहे हैं, तो प्राकृतिक क्रम एलएसबी-पहला है। हालांकि, एक TCP/IP पैकेट के लिए एक सीआरसी की गणना के लिए, MSB पहले अधिक समझ में आता है। – comingstorm

उत्तर

7

इस बारे में सोचने का एक और तरीका यह है कि अंतहीनता केवल तब लागू होती है जब आप किसी आइटम के घटकों को व्यक्तिगत रूप से पढ़ सकते हैं - क्योंकि आप आमतौर पर 32-बिट int के व्यक्तिगत बाइट्स को स्मृति से स्वतंत्र रूप से पढ़ सकते हैं, अगर आप उनको समझना चाहते हैं बाइट्स को 32-बिट int के रूप में आपको यह सुनिश्चित करने की आवश्यकता है कि आर्किटेक्चर की अंतहीनता को ध्यान में रखा जाए।

आम तौर पर आप बाइट के व्यक्तिगत बिट्स को स्मृति से नहीं पढ़ सकते हैं, इसलिए स्मृति वास्तुकला के संबंध में वास्तव में 'बिट एंडियननेस' की कोई अवधारणा नहीं है (मुझे यकीन है कि हार्डवेयर स्तर पर है, लेकिन सॉफ्टवेयर स्तर पर आप कुछ नहीं देख सकते हैं)। कुछ क्षेत्र हैं जहां आप से निपटने के लिए आवश्यकता हो सकती है (या कम से कम के बारे में पता होना) बिट endianness:

  1. आदेश है कि एक सा मैदान के संकलक भंडार बिट्स संकलक निर्भर है (और जरूरी से संबंधित नहीं है हार्डवेयर प्लेटफार्म की अंतहीनता - विभिन्न कंपाइलर एक ही मंच के लिए अलग-अलग बिट फ़ील्ड का ऑर्डर कर सकते हैं - यह संभव है कि एक कंपाइलर को एक तरफ कॉन्फ़िगर किया जा सके या दूसरा कमांड लाइन विकल्प का उपयोग कर, char को हस्ताक्षरित या हस्ताक्षरित करने के लिए सेट किया जा सकता है) । हालांकि, सी बिट फ़ील्ड में हार्डवेयर एड्रेसिंग के साथ वास्तव में कुछ भी नहीं है।

  2. कुछ हार्डवेयर आर्किटेक्चर आप, अलग-अलग बिट्स (उदाहरण के लिए एआरएम कॉर्टेक्स एम 3) को संबोधित करने के इसलिए इस मामले में आप जानना चाहते हैं कि वास्तुकला की व्यवस्था की बिट्स संबोधित करने के लिए आपको लगता है कि सुविधा का उपयोग करने थे अगर आवश्यकता होगी अनुमति नहीं ।

  3. यदि आप एक सीरियल लिंक पर बिट भेज रहे हैं - हार्डवेयर इंटरफ़ेस आम तौर पर निर्दिष्ट करेगा कि सबसे महत्वपूर्ण बिट या कम से कम महत्वपूर्ण बिट पहले तार पर 'स्थानांतरित' हो गया है या नहीं।

7

endianness केवल बाइट क्रम पर लागू होता है, नहीं क्रम सा। बिट्स का क्रम इसी बाइट के भीतर समान होगा।

3

हां, वे वही होंगे।

बाइट्स के अंदर बिट ऑर्डर आमतौर पर केवल एक समस्या है जब आप बिट-बाय-बिट I/O कर रहे हैं उदाहरण के लिए सीरियल लाइन पर भेजे गए डेटा की स्ट्रीम पढ़ते समय। वे वास्तव में एक समय में एक ही बिट भेजते हैं, इसलिए प्रत्येक बाइट के लिए बिट्स को बाएं से दाएं या दाएं से बाएं भेजे जाने पर प्रेषक और रिसीवर से सहमत होना चाहिए।

फ़ाइलों के लिए, और मेमोरी एक्सेस, बाइट्स के अंदर बिट ऑर्डरिंग नहीं बदलेगी।

1

थोड़ा उलझन में :-)। धारावाहिक संचार को छोड़कर, "प्रथम बिट" शब्द का कोई अर्थ नहीं है, केवल बाएं सबसे अधिक (सबसे महत्वपूर्ण) और दाएं सबसे कम (कम से कम महत्वपूर्ण) बिट्स हैं। अगर किसी ने आपको "पहले तीन बिट्स" निकालने के लिए कहा है तो उन्हें एक थप्पड़ दें और पूछें कि उनका क्या मतलब है। यहां तक ​​कि "बिट 0" शब्द संदिग्ध है, इसका अर्थ अक्सर कम से कम महत्वपूर्ण, सही-थोड़ा (2 ** 0 बिट) होता है, लेकिन लगभग थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी-थोड़ी सी बात का मतलब ।एक बाइट में "पहला" बिट कितना बिट है जो आप बिट्स के साथ क्या कर रहे हैं पर निर्भर करता है।

1

सी में बिटवाई ऑपरेटरों को मान पर काम करने के लिए परिभाषित किया गया है। अभिव्यक्ति 0x41U >> 5 हमेशा मान 2 (बाइनरी, 010 में) देगी।

0

बिट क्रम मायने रखती है जब एक क्षेत्र एक बाइट का हिस्सा उपयोग करता है, या शुरू करने या समाप्त होने (या दोनों) एक बाइट के माध्यम से भाग रास्ता बाइट्स तक फैली है।

उदाहरण: डेटा के 2 बाइट पहले 235 (दशमलव) दूसरे 173 (दशमलव), उर्फ ​​हेक्स ईबी और एडी।

मैं 12 वीं बिट के माध्यम से चौथे बिट से शुरू होने वाला थोड़ा सा क्षेत्र चाहता हूं। तो, 3 बिट्स को छोड़, अगले 9 बिट्स से एक 9 बिट अहस्ताक्षरित पूर्णांक बनाते हैं।

 
    byteOrder, bitOrder 

* bigEndian, bigEndian results in hex 0BA or decimal 186 
* littleEndian, littleEndian results in hex 1BD or decimal 445 
* littleEndian, bigEndian results in hex 05D or decimal 93 
* bigEndian, littleEndian results in hex 1DE or decimal 478 

मैं डेटा में इन 4 के पहले 3 देखा है:

मैं दावा 4 संभावित परिणामों कर रहे हैं। , बड़े बड़े, और छोटे, छोटे बाहर काम करने के लिए आसान कर रहे हैं।

इससे निपटने के लिए संकेत।

यदि बाइट ऑर्डर बड़ा एंडियन है, तो बाईं ओर बाएं से दाएं बाएं लिखें। यदि बाइट ऑर्डर थोड़ा एंडियन है, तो दाएं से बाएं से बाइट्स लिखें।

संबंधित मुद्दे