दिलचस्प पोस्ट
हाइबरनेट 5 में पदावनत बनाते हैं मैं कैसे फेसबुक के sharer.php को अनुकूलित कर सकता हूँ PHP: संदर्भ URL कैसे प्राप्त करें? मेरे विशिष्ट फॉर्म तत्वों में शैलियों को लागू करने के लिए मैं कैसे jQuery के मोबाइल को रोक सकता हूं एएसपी.Net फॉर्म को प्रस्तुत डाक डेटा को पढ़ें संपादन लेबल में Android लेबल या बुलबुले jQuery के addEventListener विधि के बराबर jQuery निर्देशिका और सभी उप निर्देशिकाओं में सभी फाइलों को खोजने के लिए क्या इसका एक तेज़ तरीका है? ऐसे फाइल को लोड नहीं कर सकता – rvm pkg install zlib का उपयोग करने के बाद भी zlib सी # के लिए सही संस्करण संख्याएं क्या हैं? आर सी आर सी से आंशिक वापसी को संभालने गलत अनुरोध पर onActivityResult में कोड कस्टम डब्लूसीएफ डाटा कंट्रेक्टसिरियालाइजर सी # ऑब्जेक्ट पूलिंग पैटर्न कार्यान्वयन क्या मैं एक HTML <canvas> तत्व पर एंटीअलियाज़िंग को बंद कर सकता / सकती हूं?

कैसे iPhone में बाइट सरणी के लिए NSData परिवर्तित?

मैं NSData को एक बाइट सरणी में बदलना चाहता हूं, इसलिए मैं निम्नलिखित कोड लिखूंगा:

 NSData *data = [NSData dataWithContentsOfFile:filePath]; int len = [data length]; Byte byteData[len]; byteData = [data bytes]; 

लेकिन कोड की आखिरी पंक्ति में "असाइनमेंट में असंगत प्रकार" कहकर एक त्रुटि आती है डेटा को बाइट सरणी में कनवर्ट करने का सही तरीका क्या है?

Solutions Collecting From Web of "कैसे iPhone में बाइट सरणी के लिए NSData परिवर्तित?"

आप Byte byteData[len]; एक चर का उपयोग करके एक सरणी नहीं घोषित कर सकते हैं Byte byteData[len]; काम नहीं करेगा यदि आप पॉइंटर से डेटा की प्रतिलिपि बनाना चाहते हैं, तो आपको memcpy की आवश्यकता है (जो संकेतक द्वारा इंगित किए गए डेटा के माध्यम से जाएंगे और प्रत्येक बाइट को निर्दिष्ट लंबाई तक कॉपी करेंगे)।

प्रयत्न:

 NSData *data = [NSData dataWithContentsOfFile:filePath]; NSUInteger len = [data length]; Byte *byteData = (Byte*)malloc(len); memcpy(byteData, [data bytes], len); 

यह कोड गतिशील रूप से सही आकार में सरणी को आवंटित करेगा (आपके द्वारा किए जाने पर आपको free(byteData) करना होगा) और इसमें बाइट की प्रतिलिपि बनाएं।

आप getBytes:length: उपयोग भी कर सकते हैं getBytes:length: जैसा कि आप दूसरों की ओर संकेत करते हैं, यदि आप एक निश्चित लंबाई सरणी का उपयोग करना चाहते हैं यह malloc / मुक्त से बचा जाता है लेकिन बफर ओवरफ्लो के मामलों में कम विस्तारणीय और अधिक प्रबल होता है, इसलिए मैं इसे कभी-कभी कभी उपयोग नहीं करता।

आप बस उन बाइट्स का उपयोग भी कर सकते हैं जहां वे हैं, उन्हें आपको आवश्यकता वाले प्रकार में कास्ट कर सकते हैं।

 unsigned char *bytePtr = (unsigned char *)[data bytes]; 

पहले से ही उत्तर दिया, लेकिन अन्य पाठकों की मदद करने के लिए सामान्यीकरण:

  //Here: NSData * fileData; uint8_t * bytePtr = (uint8_t * )[fileData bytes]; // Here, For getting individual bytes from fileData, uint8_t is used. // You may choose any other data type per your need, eg. uint16, int32, char, uchar, ... . // Make sure, fileData has atleast number of bytes that a single byte chunk would need. eg. for int32, fileData length must be > 4 bytes. Makes sense ? // Now, if you want to access whole data (fileData) as an array of uint8_t NSInteger totalData = [fileData length] / sizeof(uint8_t); for (int i = 0 ; i < totalData; i ++) { NSLog(@"data byte chunk : %x", bytePtr[i]); } 

का हस्ताक्षर -[NSData bytes] है - (const void *)bytes आप स्टैक पर एक सरणी के लिए एक पॉइंटर निर्दिष्ट नहीं कर सकते। यदि आप -[NSData getBytes:] ऑब्जेक्ट द्वारा एरे में प्रबंधित बफर को प्रतिलिपि बनाना चाहते हैं, तो -[NSData getBytes:] । यदि आप इसे कॉपी किए बिना करना चाहते हैं, तो एक सरणी को आवंटित नहीं करें; सिर्फ एक पॉइंटर वैरिएबल घोषित करें और NSData आपके लिए मेमोरी प्रबंधित करें।

इसका कारण यह है कि [डेटा बाइट्स] का रिटर्न प्रकार एक शून्य * सी-स्टाइल सरणी है, न कि यूआईटी 8 (जो कि बाइट एक टाइपिंगफ़िफ़ है)।

त्रुटि इसलिए है क्योंकि आप एक आवंटित सरणी सेट करने का प्रयास कर रहे हैं जब रिटर्न एक पॉइंटर प्रकार होता है, आप जो मिल रहे हैं वह है GetBytes: लंबाई: कॉल जो दिखता है:

 [data getBytes:&byteData length:len]; 

जो आपके द्वारा एनएसडीटा ऑब्जेक्ट के डेटा के साथ आवंटित किए गए सरणी को भरता है