2010-09-30 10 views
6

में कैसे हटा सकता हूं यह कुछ हद तक this posting का पालन करता है लेकिन एक अलग प्रश्न के साथ मुझे लगा कि मुझे एक अलग थ्रेड में पूछना चाहिए।मैं एनएसआईएनटेगर या NSUInteger के बाइट ऑर्डर को उद्देश्य-सी

मैं उस बिंदु पर हूं जहां मेरे पास स्मृति में लगातार चार बाइट हैं जिन्हें मैंने फ़ाइल से पढ़ा है। मैं इन्हें थोड़ा सरणी के रूप में स्टोर करना चाहता हूं (उनमें से वास्तविक int मान बाद में कोई फर्क नहीं पड़ता)। जब मैं अपने int में क्या प्रिंट करता हूं, तो मुझे लगता है कि यह रिवर्स ऑर्डर (थोड़ा एंडियन) में संग्रहीत किया जाता है।

क्या किसी के पास बाइट्स के क्रम को उलटाने के लिए एक अच्छी विधि है। फिर एक बार उलट दिया, लगातार दो बिट्स फैलाने और एक int में वापस परिवर्तित करने के लिए लगातार बिट्स उठा?

unsigned char data[] = { 0x00, 0x02, 0x45, 0x28 }; 
NSInteger intData = *((NSInteger *)data); 

NSLog(@"data:%08x", intData); // data:28450200 

उत्तर

15

कोको (या सटीक फाउंडेशन ढांचे होने के लिए) बाइट्स की endianness स्वैप करने के लिए कार्य करता है: NSSwapInt, NSSwapShort, NSSwapLong, और NSSwapLongLong। बाइट्स के चारों ओर ये स्वैप कोई फर्क नहीं पड़ता कि वे छोटे-एंडियन पूर्णांक से बड़े-एंडियन पूर्णांक बनाते हैं और इसके विपरीत।

यदि आप जानते हैं कि आपके पास कौन सा प्रारूप है, तो यह अन्य फ़ंक्शंस हैं जो इसे देशी अंतराल में बदल देते हैं: NSSwapLittleIntToHost और NSSwapBigIntToHost। रिवर्स फ़ंक्शंस भी हैं जो देशी प्रारूप से छोटे या बड़े एंडियन प्रारूप में स्वैप करते हैं: NSSwapHostIntToLittle और NSSwapHostIntToBig। वे अन्य पूर्णांक प्रकारों और फ़्लोटिंग पॉइंट प्रकारों के लिए भी उपलब्ध हैं। वे क्या करते हैं यदि वे आवश्यक हो तो मूल्यों पर आदिम स्वैप कार्यों को कॉल करते हैं। तो NSSwapLittleIntToHost कुछ भी नहीं करता है जबकि NSSwapBigIntToHost थोड़ा एंडियन मशीन पर NSSwapInt का परिणाम देता है।

ध्यान दें कि ये कंपाइलर्स पूर्णांक प्रकारों के पैरामीटर लेते हैं और NSInteger प्रकार नहीं। तो गीलेर के आधार पर आप 32 बिट या 64 बिट कोड उत्पन्न कर रहे हैं, यदि आप NSInteger का उपयोग कर रहे हैं तो आपको विभिन्न कार्यों का उपयोग करना होगा।

आपको अपने बाइट सरणी को एक पूर्णांक सूचक और अव्यवस्था में भी नहीं डालना चाहिए। बिट शिफ्ट ऑपरेशंस का उपयोग करके पूर्णांक को इकट्ठा करना बेहतर होगा। आपका कोड केवल तभी काम करेगा यदि NSInteger 32 बिट चौड़ा है। यदि यह 64 बिट है तो आपका नंबर कचरा होगा या आपका प्रोग्राम भी क्रैश हो सकता है। लेकिन यहां तक ​​कि यदि आप एक पूर्णांक प्रकार का उपयोग कर रहे हैं जो कि उदाहरण के लिए सी 99 <stdint.h> हेडर से 32 बिट चौड़ा (int32_t है) यह संभवतः काम नहीं कर सकता है।

+0

धन्यवाद मैंने थोड़ा सा देखा और NSSwapBigIntToHost नहीं मिला। मैंने सुझाए गए कुछ कम बिट मैनिप्ल्यूशन को समाप्त कर दिया। मैं थोड़ा सा धारणा कर रहा हूं कि मेरे कोड में मेरी इंट 32-बिट होगी। मैं जो कर रहा था वह एक हस्ताक्षरित char * tref = (unsigned char *) &temp; बना रहा था, फिर मैं बाइट्स के माध्यम से लूप और स्वैप कर रहा था, फिर एक पूर्णांक में ट्रेफ डाला। सुंदर नहीं है लेकिन जब तक मैं 32-बिट पर काम करता हूं तब तक काम करता है। – Scott

+0

महान प्रश्न और उत्तर – LolaRun

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