2009-01-20 18 views
7

नेटवर्क बाइट ऑर्डर में थोड़ा-एंडियन सिस्टम में डेटा को कनवर्ट करने के लिए आवश्यक अंतर्निहित परिवर्तन क्या हैं? 2 बाइट और 4 बाइट डेटा के लिए परिवर्तनों को समाहित करने के लिए प्रसिद्ध कार्यों (जैसे एचटीओएन, एनओटीएचएल इत्यादि) हैं, 1 बाइट डेटा (यदि कुछ भी हो) के तारों के लिए क्या होता है?डेटा को नेटवर्क ऑर्डर में बदलने के लिए छोटे-एंडियन सिस्टम द्वारा कौन से परिवर्तनों का उपयोग किया जाता है?

इसके अलावा, विकिपीडिया का तात्पर्य है कि छोटे-एंडियन बड़े-एंडियन की दर्पण छवि है, लेकिन यदि यह सच था तो हमें 2 और 4 बाइट डेटा के लिए विशिष्ट हैंडलिंग की आवश्यकता क्यों होगी?

निबंध "ऑन होली वॉर्स एंड पीला फॉर पीस" निबंध का अर्थ यह है कि छोटे-छोटे अंतराल के कई अलग-अलग स्वाद हैं - यह एक पुराना निबंध है - क्या यह अभी भी लागू होता है? जावा क्लास फाइलों की शुरुआत में पाए गए बाइट ऑर्डर मार्कर अभी भी जरूरी हैं?

और आखिरकार, 4-बाइट संरेखण नेटवर्क-बाइट ऑर्डर के लिए आवश्यक है?

उत्तर

6

मान लें कि आपके पास बाइट्स के b सरणी में ASCII टेक्स्ट "बिगई" है।

b[0] == 'B' 
b[1] == 'i' 
b[2] == 'g' 
b[3] == 'E' 

यह स्ट्रिंग के लिए नेटवर्क ऑर्डर भी है।

यदि यह एक 32 बिट पूर्णांक के रूप में इलाज किया गया था, यह

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 
एक छोटे endian मंच पर

और

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

होगा एक बड़ा endian मंच पर।

आपको प्रत्येक 16-बिट काम परिवर्तित, तो आप इन

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

जिसके कारण ntohl और ntohs दोनों आवश्यक हैं में से कोई भी मिल चाहते हैं।

दूसरे शब्दों में, ntohs 16-बिट शॉर्ट के भीतर बाइट्स को स्वैप करता है, और ntohl अपने 32-बिट शब्द के चार बाइट्स के क्रम को उलट देता है। 2 और 4 बाइट डाटा के लिए

0

विशिष्ट हैंडलिंग कार्यों तथ्य प्रोसेसर निर्देश है कि विशिष्ट डेटा आकार पर काम देखते हैं कि का लाभ लेने के। एक 1-बाइट पीछे समारोह चल रहा है चार बार व्यापक निर्देशों का उपयोग कर एक ही बार में सभी चार बाइट्स पर एक ही (यद्यपि पैमाने में वृद्धि हुई) कार्रवाई करने की तुलना में निश्चित रूप से कम कुशल है।

0

1 बाइट डाटा endians के बीच किसी भी रूपांतरण (यह स्ट्रिंग एन्कोडिंग के लिए UTF-16 और UTF-32 से अधिक UTF-8 का एक फायदा है) की आवश्यकता नहीं है।

0

नेटवर्क-बाइट ऑर्डर के लिए आवश्यक 4-बाइट संरेखण है?

किसी नेटवर्क पर बाइट्स के लिए कोई विशिष्ट संरेखण आवश्यक नहीं है। आपका प्रोसेसर स्मृति में एक निश्चित संरेखण की मांग कर सकता है, लेकिन विसंगति को हल करने के लिए यह आपके ऊपर निर्भर है। X86 परिवार आमतौर पर ऐसी मांग नहीं करता है।

0

मूल विचार सभी मल्टी-बाइट प्रकार उनकी बाइट्स उलट के आदेश के लिए होता है। एक चार बाइट पूर्णांक में बाइट 0 और 3 स्वैप होंगे, और बाइट्स 1 और 2 स्वैप हो जाएंगे। एक दो बाइट पूर्णांक बाइट 0 और 1 swapped होगा। एक बाइट चरित्र स्वैप नहीं होता है।

दो बहुत महत्वपूर्ण इस के निहितार्थ है कि गैर चिकित्सकों और novices हमेशा एहसास नहीं है के होते हैं:

  1. (ASCII) चरित्र तार छुआ नहीं कर रहे हैं।
  2. नहीं बाइट स्वैप जेनेरिक "डेटा" के लिए संभावित अंधा एल्गोरिदम है। आपको अपने सभी डेटा के प्रकार को जानना होगा और प्रत्येक आइटम को अपने प्रकार के लिए आवश्यक तरीके से स्वैप करना होगा।