NSData को NSString में Objective c में बदलना


87

मैं NSData को NSString में बदलना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है?

मैं इस कोड का उपयोग कर रहा हूं, लेकिन अंतिम स्ट्रिंग शून्य देता है

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);

जब मैं कंसोल देखूंगा तो यह अशक्त हो जाएगा।


@ नाइक .... @ मारविन: आप एक ही व्यक्ति हैं या एक ही लैन के भीतर से? मुझे बस आश्चर्य है, क्यों आपके पहचानकर्ता बिल्कुल समान हैं।
vikingosegundo

स्ट्रिंग क्या है? यदि आप कर रहे हैं nilतो मुझे लगता है कि आपका डेटा एक मान्य utf8 स्ट्रिंग नहीं है?
deanWombourne

@vikingosegundo अपनी तरह की जानकारी के लिए मैं nik नहीं जानता ...
मेहुल मिस्त्री

यह वास्तव में हास्यास्पद है, क्योंकि यह बहुत ही संभावना नहीं है। लेकिन फिर भी संभव है।
vikingosegundo

जवाबों:


47

के लिए डॉक्स NSStringकहते हैं

https://developer.apple.com/documentation/foundation/nsstring/1416374-initwithdata

एन्कोडिंग का उपयोग करके यूनिकोड वर्णों में डेटा में बाइट्स को परिवर्तित करके एक एनएसएसट्रिंग ऑब्जेक्ट आरंभिक मान लौटाएं। लौटी हुई वस्तु मूल रिसीवर से अलग हो सकती है। यदि किसी कारण से आरंभिक विफलता विफल हो जाती है (उदाहरण के लिए यदि डेटा एन्कोडिंग के लिए मान्य डेटा का प्रतिनिधित्व नहीं करता है) तो शून्य हो जाता है।

आपको यह जांचने के लिए अन्य एन्कोडिंग का प्रयास करना चाहिए कि क्या यह आपकी समस्या को हल करता है

 // The following constants are provided by NSString as possible string encodings.
enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5,
   NSSymbolStringEncoding = 6,
   NSNonLossyASCIIStringEncoding = 7,
   NSShiftJISStringEncoding = 8,
   NSISOLatin2StringEncoding = 9,
   NSUnicodeStringEncoding = 10,
   NSWindowsCP1251StringEncoding = 11,
   NSWindowsCP1252StringEncoding = 12,
   NSWindowsCP1253StringEncoding = 13,
   NSWindowsCP1254StringEncoding = 14,
   NSWindowsCP1250StringEncoding = 15,
   NSISO2022JPStringEncoding = 21,
   NSMacOSRomanStringEncoding = 30,
   NSUTF16StringEncoding = NSUnicodeStringEncoding,
   NSUTF16BigEndianStringEncoding = 0x90000100,
   NSUTF16LittleEndianStringEncoding = 0x94000100,
   NSUTF32StringEncoding = 0x8c000100,
   NSUTF32BigEndianStringEncoding = 0x98000100,
   NSUTF32LittleEndianStringEncoding = 0x9c000100,
   NSProprietaryStringEncoding = 65536
};

NSASCIIStringEncoding
जॉन एरक

मैंने lldb में संख्याओं का उपयोग किया। अन्यथा यह काम नहीं करता था। धन्यवाद।
ओखन ओबेय

1
नोट: यदि आप अपने एन्कोडिंग प्रकार के बारे में अनिश्चित हैं या यदि यह हमेशा समान नहीं होता है, तो यह दृष्टिकोण आपके लिए अच्छा होगा: stackoverflow.com/a/50691430/2057171
अल्बर्ट रेनशॉ

94

नीचे दिए गए कोड का उपयोग करें।

NSString* myString;
myString = [[NSString alloc] initWithData:nsdata encoding:NSASCIIStringEncoding];

9
यह मुझे उचित स्ट्रिंग नहीं देगा
मेहुल मिस्त्री

3
यदि नहीं, तो यह नहीं है NSASCIIStringEncoding। अन्य एन्कोडिंग के लिए फेलिप्स का उत्तर देखें
vikingosegundo

इस कूटबन्धन के लिए NSUTF8StringEncoding दे रही है
शौकत शेख

15

-[NSString initWithData:encoding]nilयदि निर्दिष्ट एन्कोडिंग डेटा के एन्कोडिंग से मेल नहीं खाती है तो वापस आ जाएगी ।

सुनिश्चित करें कि आपका डेटा UTF-8 में एनकोडेड है (या डेटा के लिए जो भी एन्कोडिंग उपयुक्त है, उसमें NSUTF8StringEncoding बदलें)।


मैंने NSdata में एक छवि को परिवर्तित किया और NSUTF8StringEccoding का उपयोग करके फिर से NSdata को स्ट्रिंग में परिवर्तित किया। लेकिन यह शून्य दिखा रहा है।
रामकृष्ण

6
NSString *string = [NSString stringWithUTF8String:[Data bytes]];

1
यह वर्णित के रूप में काम नहीं करता है [[NSString आवंटन] initWithData: हेड एन्कोडिंग: NSUTF8StringEncoding] काम करता है
रयान

2

-[NSString initWithData:encoding] आपका मित्र है, लेकिन केवल तभी जब आप एक उचित एन्कोडिंग का उपयोग करते हैं।



1

स्विफ्ट:

let jsonString = String(data: jsonData, encoding: .ascii)

या .utf8जो भी उचित हो एन्कोडिंग


1

डेटा के एन्कोडिंग प्रकार की अनिश्चितता? कोई दिक्कत नहीं है!

संभावित एन्कोडिंग प्रकारों को जानने की आवश्यकता के बिना, जिसमें गलत एन्कोडिंग प्रकार आपको शून्य / अशक्त कर देंगे, यह आपके सभी आधारों को कवर करना चाहिए:

NSString *dataString = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

किया हुआ!




नोट: इस स्थिति में यह किसी भी तरह से विफल हो जाता है, तो आप अपने NSData को अनपैक कर सकते हैं NSKeyedUnarchiver , फिर से (id)unpackedफिर से NSKeyedArchiverरीपैक्स कर सकते हैं , और यह कि NSData फॉर्म बेस64 एनकोडेबल होना चाहिए।

id unpacked = [NSKeyedUnarchiver unarchiveObjectWithData:data];
data = [NSKeyedArchiver archivedDataWithRootObject:unpacked];

0

उद्देश्य सी में:

NSData *tmpData;
NSString *tmpString = [NSString stringWithFormat:@"%@", tmpData];
NSLog(tmpString)

यह गलत है, यह कुछ इस तरह लौटेगा {length = XX, bytes = 0xYYYYYYYY}और मुझे लगता है कि सवाल यह था कि कच्चे बाइट्स से एन्कोडेड स्ट्रिंग को कैसे खोलना है, न कि उनका विवरण
किशमिश

0

उद्देश्य सी में NSData में एम्बेडेड स्ट्रिंग के एन्कोडिंग का पता लगाने के लिए एक अंतर्निहित तरीका शामिल है।

NSData* data = // Assign your NSData object...

NSString* string;
NSStringEncoding encoding = [NSString stringEncodingForData:data encodingOptions:nil convertedString:&string usedLossyConversion:nil];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.