ios - यूटीएफ-8 एन्कोडेड एनएसडीटा को एनएसएसटींग में कनवर्ट करें




nsstring nsdata (4)

आप इस विधि को कॉल कर सकते हैं

+(id)stringWithUTF8String:(const char *)bytes.

मेरे पास विंडोज सर्वर से यूटीएफ -8 एनकोडेड NSData है और मैं इसे आईफोन के लिए NSString परिवर्तित करना चाहता हूं। चूंकि डेटा में वर्ण होते हैं (एक डिग्री प्रतीक की तरह) जिसमें दोनों प्लेटफ़ॉर्म पर अलग-अलग मान होते हैं, मैं डेटा को स्ट्रिंग में कैसे परिवर्तित करूं?


कभी-कभी, अन्य उत्तरों में विधियां काम नहीं करती हैं। मेरे मामले में, मैं अपनी आरएसए निजी कुंजी के साथ हस्ताक्षर उत्पन्न कर रहा हूं और परिणाम एनएसडीटा है। मैंने पाया कि यह काम करता है:

उद्देश्य सी

NSData *signature;
NSString *signatureString = [signature base64EncodedStringWithOptions:0];

तीव्र

let signatureString = signature.base64EncodedStringWithOptions(nil)

यदि डेटा शून्य-समाप्त नहीं होता है, तो आपको -initWithData:encoding: उपयोग करना चाहिए -initWithData:encoding:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

यदि डेटा शून्य-समाप्त हो गया है, तो आपको अंत में अतिरिक्त \0 से बचने के लिए -stringWithUTF8String: उपयोग करना चाहिए।

NSString* newStr = [NSString stringWithUTF8String:[theData bytes]];

(ध्यान दें कि यदि इनपुट ठीक से यूटीएफ -8-एन्कोडेड नहीं है, तो आपको nil मिल जाएगी।)

स्विफ्ट संस्करण:

let newStr = String(data: data, encoding: .utf8)
// note that `newStr` is a `String?`, not a `String`.

यदि डेटा निरस्त हो गया है, तो आप उस सुरक्षित तरीके को छोड़ सकते हैं जो उस शून्य चरित्र को हटा देता है, या उपरोक्त उद्देश्य-सी संस्करण के समान असुरक्षित तरीका है।

// safe way, provided data is \0-terminated
let newStr1 = String(data: data.subdata(in: 0 ..< data.count - 1), encoding: .utf8)
// unsafe way, provided data is \0-terminated
let newStr2 = data.withUnsafeBytes(String.init(utf8String:))

संक्षेप में संक्षेप में, यहां एक पूरा जवाब है, जो मेरे लिए काम करता है।

मेरी समस्या यह थी कि जब मैंने उपयोग किया

[NSString stringWithUTF8String:(char *)data.bytes];

मुझे मिली स्ट्रिंग अप्रत्याशित थी: लगभग 70% में इसमें अपेक्षित मूल्य होता था, लेकिन अक्सर यह Null या इससे भी बदतर होता था: स्ट्रिंग के अंत में कचरा होता था।

कुछ खुदाई के बाद मैं स्विच किया

[[NSString alloc] initWithBytes:(char *)data.bytes length:data.length encoding:NSUTF8StringEncoding];

और हर बार अपेक्षित परिणाम मिला।





nsdata