स्ट्रिंग में NSData कन्वर्ट?


122

मैं nsdata के रूप में एक खुलता निजी कुंजी EVP_PKEY संग्रहीत कर रहा हूँ। इसके लिए मैं नीचे दिए गए कोड का उपयोग करके एक बाइट स्ट्रीम में सीरियल कर रहा हूं

unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
p = buf;
i2d_PrivateKey(pkey, &p);

जहां पिव ईवीपी_पीकेवाई का प्रकार है। फिर मैं नीचे दिए गए लाइन का उपयोग करके एक NSData के रूप में बफ़र 'पी' से बाइट्स संग्रहीत कर रहा हूं

NSData *keydata = [NSData dataWithBytes:P length:len];

अब मैं इसे नीचे दिए गए कोड का उपयोग करके एक NSString में परिवर्तित कर रहा हूं, लेकिन जब मैं इसे अपने कुछ अन्य वर्णों को सांत्वना देने के लिए प्रिंट करता हूं।

NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];

क्या कोई मदद कर सकता है?

मूल रूप से मैं EVP_PKEY को एक sqlite डेटाबेस में संग्रहीत करना चाहता हूं

क्या मैं सही मार्ग पर हूं? धन्यवाद।


आपका क्या मतलब है, "कुछ अन्य वर्ण"? क्या यह अंत में अतिरिक्त वर्णों को मुद्रित कर रहा है जो कि नहीं होना चाहिए, या क्या यह आपकी अपेक्षा से पूरी तरह से भिन्न वर्णों को मुद्रित कर रहा है?
टॉम हैरिंगटन

इसकी पूरी तरह से यह क्या है से अलग है
Zach

क्या आप सुनिश्चित हैं कि डेटा वास्तव में UTF-8 एन्कोडेड है? मैं i2d_PStreetKey से परिचित नहीं हूं, लेकिन आपके परिणाम बताते हैं कि आप सही स्ट्रिंग एन्कोडिंग का उपयोग नहीं कर रहे हैं।
टॉम हैरिंगटन

@TOm: धन्यवाद। यह ASCIIEncoding था। अब इसका काम ठीक है
Zach

नहीं, आप यहां सही रास्ते पर नहीं हैं, और सभी जवाब गलत हैं। यदि आप में डेटा परिवर्तित करना चाहते हैं आप एन्कोडिंग base64 का उपयोग करना चाहिए NSDataकरने के लिए NSString
Maarten Bodewes 16

जवाबों:


260

उद्देश्य सी

आप ( एनएसएसट्रिंग क्लास संदर्भ देखें ) का उपयोग कर सकते हैं

- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

उदाहरण:

NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

टिप्पणी : कृपया ध्यान दें कि NSDataनिर्दिष्ट एन्कोडिंग के लिए मान मान्य होना चाहिए (ऊपर के उदाहरण में UTF-8), अन्यथा nilवापस लौटा दिया जाएगा:

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

पहले स्विफ्ट 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

स्विफ्ट 3.0 आगे

String(data: yourData, encoding: .utf8)

देखें स्ट्रिंग # init (डेटा: एन्कोडिंग :) संदर्भ


आपके उत्तर के लिए धन्यवाद। मैंने पहले ही प्रयास किया है कि कोई सफलता न मिले।
जक

26
डिबगर पर:po [[NSString alloc] initWithData:myData encoding:4]
बेरिक

7
इस उत्तर NSDataमें यूटीएफ -8 रेंज से बाहर के लोगों सहित किसी भी बाइट वैल्यू को शामिल करने के बावजूद कई उत्थान कैसे हो सकते हैं?
Maarten Bodewes 16

2
क्योंकि यहां जो लोग हैं, वे सर्वर से स्ट्रिंग में डेटा प्रतिक्रिया को परिवर्तित कर रहे हैं।
नेक्रो

1
क्या होगा यदि NSData <strong> वास्तव में </ strong> में UTF-8 श्रेणी के बाहर मान हैं?
ज़ेनिचीमारो

24

पिछली स्विफ्ट 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

स्विफ्ट 4.0 के लिए:

String(data: yourData, encoding: .utf8)

3

मेरा मानना ​​है कि आपके "पी" को डेटाविथबाइट्स परम के रूप में माना जाता है

NSData *keydata = [NSData dataWithBytes:P length:len];

"बफ़" होना चाहिए

NSData *keydata = [NSData dataWithBytes:buf length:len];

चूंकि i2d_PStreetKey सूचक को बफर के अंत में आउटपुट बफर पी पर रखता है और आगे इनपुट की प्रतीक्षा कर रहा है, और buf अभी भी आपके बफर की शुरुआत की ओर इशारा कर रहा है।

निम्नलिखित कोड मेरे लिए काम करता है जहाँ pkey एक EVP_PKEY का पॉइंटर है:

unsigned char *buf, *pp;
int len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
pp = buf;
i2d_PrivateKey(pkey, &pp);

NSData* pkeyData = [NSData dataWithBytes:(const void *)buf length:len];
DLog(@"Private key in hex (%d): %@", len, pkeyData);

आप अपने द्विआधारी डेटा को बेस 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) में बदलने के लिए एक ऑनलाइन कन्वर्टर का उपयोग कर सकते हैं और निम्न कमांड का उपयोग करने के बाद अपनी सर्टिफ़िकेट फ़ाइल में निजी कुंजी से तुलना कर सकते हैं और mypkey.pem के आउटपुट की जाँच:

openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem

मैंने आपके प्रश्न और इस ईवीपी फ़ंक्शन साइट को मेरे उत्तर के लिए संदर्भित किया ।



1

NSData को NSString में परिवर्तित करने का एक सरल तरीका यह है कि इसे बेस 64 एनकोड किया जाए।

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

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


1

स्विफ्ट 5 :

String(data: data!, encoding: String.Encoding.utf8)

यह सिर्फ मेरे लिए बेहतर है कि pierre23 उत्तर की एक संशोधित प्रति है - मैंने आमतौर पर इस पृष्ठ का उपयोग कोड की प्रतिलिपि बनाने के लिए किया था और डेटा के लिए अपने डेटा को संशोधित करना था! उस समय लगता है। अब मैं और आप एक संशोधन के बिना कॉपी और पेस्ट करते हैं।
अलेक्जेंडर वोल्कोव

यह स्विफ्ट से जुड़ा सवाल नहीं है। अधिक, प्रश्न में कोड नमूना उद्देश्य-सी कोड है। और अंत में अपने कोड से मजबूर पूर्ववत नहीं करना अप्रत्याशित दुर्घटनाओं का कारण बन सकता है।
क्राइस्ट

@ क्रिकट प्रश्न को ओब्ज-सी के रूप में टैग नहीं किया गया है।
Eiko

@AlexanderVolkov आप इसके लिए एक Xcode स्निपेट जोड़ सकते हैं, यह इससे भी तेज होगा;)
Cristik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.