(१) बाइट क्रम का क्या अर्थ है, C में चार का एक अचूक अर्थ? क्या यूटीएफ -16 एक बाइट अनुक्रम है, या फिर यह क्या है? (२) बाइट अनुक्रम का चर लंबाई से कोई लेना-देना क्यों नहीं है?
आप गलत समझ रहे हैं कि एंडियन मुद्दे क्या हैं। यहाँ एक संक्षिप्त सारांश है।
एक 32-बिट पूर्णांक 4 बाइट्स लेता है। अब, हम इन बाइट्स के तार्किक क्रम को जानते हैं। यदि आपके पास 32-बिट पूर्णांक है, तो आप निम्न कोड के साथ इसका उच्च बाइट प्राप्त कर सकते हैं:
uint32_t value = 0x8100FF32;
uint8_t highByte = (uint8_t)((value >> 24) & 0xFF); //Now contains 0x81
वह सब अच्छा और अच्छा है। जहां समस्या शुरू होती है कि कैसे विभिन्न हार्डवेयर स्टोर और मेमोरी से पूर्णांक प्राप्त करते हैं।
बिग एंडियन क्रम में, एक 4 बाइट का टुकड़ा जिसे आप 32-बिट पूर्णांक के रूप में पढ़ते हैं, पहले बाइट को उच्च बाइट के साथ पढ़ा जाएगा:
[0][1][2][3]
लिटिल एंडियन क्रम में, एक 4 बाइट का टुकड़ा जिसे आप 32-बिट पूर्णांक के रूप में पढ़ते हैं, पहले बाइट को कम बाइट के साथ पढ़ा जाएगा :
[3][2][1][0]
यदि आपके पास एक पॉइंटर को 32-बिट मान के लिए पॉइंटर है, तो आप ऐसा कर सकते हैं:
uint32_t value = 0x8100FF32;
uint32_t *pValue = &value;
uint8_t *pHighByte = (uint8_t*)pValue;
uint8_t highByte = pHighByte[0]; //Now contains... ?
C / C ++ के अनुसार, इसका परिणाम अपरिभाषित है। यह 0x81 हो सकता है। या यह 0x32 हो सकता है। तकनीकी रूप से, यह कुछ भी लौटा सकता है, लेकिन वास्तविक प्रणालियों के लिए, यह एक या दूसरे को लौटाएगा।
यदि आपके पास एक मेमोरी एड्रेस का पॉइंटर है, तो आप उस एड्रेस को 32-बिट वैल्यू, 16-बिट वैल्यू या 8-बिट वैल्यू के रूप में पढ़ सकते हैं। एक बड़ी एंडियन मशीन पर, सूचक उच्च बाइट को इंगित करता है; थोड़ा एंडियन मशीन पर, सूचक कम बाइट को इंगित करता है।
ध्यान दें कि यह सब पढ़ने और लिखने के लिए / स्मृति से है। इसका आंतरिक C / C ++ कोड से कोई लेना- देना नहीं है। कोड का पहला संस्करण, वह जो C / C ++ को अपरिभाषित घोषित नहीं करता है, वह हमेशा उच्च बाइट प्राप्त करने के लिए काम करेगा ।
मुद्दा यह है कि जब आप बाइट स्ट्रीम पढ़ना शुरू करते हैं। जैसे कि किसी फाइल से।
16-बिट मानों में 32-बिट वाले समान मुद्दे हैं; उनके पास केवल 4 के बजाय 2 बाइट्स हैं। इसलिए, एक फ़ाइल में 16-बिट मान हो सकते हैं जो बड़े एंडियन या छोटे एंडियन ऑर्डर में संग्रहीत होते हैं।
UTF-16 को 16-बिट मानों के अनुक्रम के रूप में परिभाषित किया गया है । प्रभावी रूप से, यह एक है uint16_t[]
। प्रत्येक व्यक्तिगत कोड इकाई एक 16-बिट मान है। इसलिए, UTF-16 को ठीक से लोड करने के लिए, आपको पता होना चाहिए कि डेटा का एंडियन-नेस क्या है।
UTF-8 को 8-बिट मानों के अनुक्रम के रूप में परिभाषित किया गया है । यह एक है uint8_t[]
। प्रत्येक व्यक्तिगत कोड इकाई 8-बिट्स आकार में है: एक एकल बाइट।
अब, दोनों UTF-16 और UTF-8 एकाधिक कोड इकाइयों (16-बिट या 8 बिट मान) को एक साथ गठबंधन करने के लिए यूनिकोड कोडपॉइंट (एक "चरित्र" के रूप में है, लेकिन यह है के लिए अनुमति नहीं है कि यह एक सरलीकरण है, सही शब्द )। कोडपॉइंट बनाने वाली इन कोड इकाइयों का क्रम UTF-16 और UTF-8 एनकोडिंग द्वारा निर्धारित किया जाता है।
UTF-16 को संसाधित करते समय, आप एक 16-बिट मान पढ़ते हैं, जो भी एंडियन रूपांतरण की आवश्यकता होती है। फिर, आप पता लगाते हैं कि यह एक सरोगेट जोड़ी है; यदि यह है, तो आप एक और 16-बिट मान पढ़ते हैं, दोनों को मिलाते हैं, और उसी से, आपको यूनिकोड कोडपॉइंट मान मिलता है।
UTF-8 को संसाधित करते समय, आप 8-बिट मान पढ़ते हैं। कोई भी एंडियन रूपांतरण संभव नहीं है, क्योंकि केवल एक बाइट है। यदि पहली बाइट मल्टी-बाइट अनुक्रम को दर्शाती है, तो आप कुछ संख्या में बाइट्स पढ़ते हैं, जैसा कि मल्टी-बाइट अनुक्रम द्वारा निर्धारित किया गया है। प्रत्येक व्यक्ति बाइट एक बाइट है और इसलिए कोई एंडियन रूपांतरण नहीं है। आदेश इन के अनुक्रम में बाइट्स, बस के रूप में UTF-16 में किराए की जोड़े के आदेश, UTF-8 से परिभाषित किया गया है।
इसलिए UTF-8 के साथ कोई एंडियन मुद्दे नहीं हो सकते।