এনএসডাটা স্ট্রিংয়ে রূপান্তর করবেন?


122

আমি একটি ওপেনসেল বেসরকারী কী EVP_PKEY কে এনএসটাটা হিসাবে সংরক্ষণ করছি। এর জন্য আমি নীচের কোডটি ব্যবহার করে একটি বাইট স্ট্রিমে সিরিয়ালাইজ করছি

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

যেখানে পিকেটি EVP_PKEY প্রকারের। তারপরে আমি নীচের দেওয়া লাইনটি ব্যবহার করে এনএসডিটা হিসাবে বাফার 'পি' থেকে বাইটগুলি সংরক্ষণ করছি

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

এখন আমি এটিকে নীচে প্রদত্ত কোডটি ব্যবহার করে একটি এনএসএসস্ট্রিং এ রূপান্তর করছি তবে যখন আমি এটি কনসোলে মুদ্রণ করি তখন এটি কিছু অন্যান্য অক্ষর দেয়।

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

কেউ সাহায্য করতে পারে?

মূলত আমি একটি স্ক্লাইট ডাটাবেসে EVP_PKEY সঞ্চয় করতে চাই

আমি কি সঠিক পথে আছি? ধন্যবাদ।


"কিছু অন্যান্য চরিত্র" বলতে কী বোঝ? এটি কি এমন অতিরিক্ত অক্ষরগুলি মুদ্রণ করছে যা সেখানে থাকা উচিত নয়, বা এটি কেবল আপনার প্রত্যাশার চেয়ে সম্পূর্ণ আলাদা অক্ষর মুদ্রণ করছে?
টম হ্যারিংটন

এটি যা হওয়ার তা থেকে সম্পূর্ণ আলাদা
Zach

আপনি কি নিশ্চিত যে ডেটাটি ইউটিএফ -8 এনকোডযুক্ত? আমি i2d_PrivateKey এর সাথে পরিচিত নই তবে আপনার ফলাফলগুলি বোঝায় যে আপনি সঠিক স্ট্রিং এনকোডিং ব্যবহার করছেন না।
টম হ্যারিংটন

@ টম: ধন্যবাদ এটি ASCIIEncoding ছিল। এখন এটি কাজ করছে
জাক

না, আপনি এখানে সঠিক পথে নেই, এবং সমস্ত উত্তর ভুল বলে মনে হচ্ছে। যদি আপনি ডাটা রূপান্তর করতে চান তাহলে এনকোডিং করুন Base64- ব্যবহার করা উচিত NSDataজন্য NSString
মার্টেন বোদেউয়েস

উত্তর:


260

উদ্দেশ্য গ

আপনি ব্যবহার করতে পারেন ( এনএসএস স্ট্রিং ক্লাস রেফারেন্স দেখুন )

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

উদাহরণ:

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

মন্তব্য : দয়া করে লক্ষ্য করুন NSDataমানটি অবশ্যই নির্দিষ্ট করা এনকোডিংয়ের জন্য বৈধ হতে হবে (উপরের উদাহরণে ইউটিএফ -8), অন্যথায় nilফিরে আসবে:

যদি কোনও কারণে সূচনা ব্যর্থ হয় তবে শূন্য দেয় (উদাহরণস্বরূপ যদি ডেটা এনকোডিংয়ের জন্য বৈধ ডেটা উপস্থাপন করে না)।

পূর্ব সুইফট 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

সুইফট 3.0 এরপরে wards

String(data: yourData, encoding: .utf8)

দেখুন স্ট্রিং # Init (ডাটা: এনকোডিং :) রেফারেন্স


আপনার জবাবের জন্য ধন্যবাদ। আমি ইতিমধ্যে চেষ্টা করেছি কোন সাফল্য ছাড়াই।
জাচ

26
po [[NSString alloc] initWithData:myData encoding:4]
ডিবাগারটিতে

7
NSDataইউটিএফ -8 ব্যাপ্তির বাইরের সমেত বাইরের মান সহ কোনও বাইট মান থাকতে পারে যদিও এই উত্তরে কীভাবে অসংখ্য উত্সাহ থাকতে পারে?
মার্টেন বোদেউয়েস

2
কারণ এখানে থাকা লোকেরা একটি ডেটা রেসপন্সকে একটি সার্ভার থেকে স্ট্রিংয়ে রূপান্তর করছে।
Necro

1
NSData <strong> সত্যই </ strong> ইউটিএফ -8 সীমার বাইরে মানগুলি কী করবে?
জেনিচিমারো

24

পূর্ব সুইফট 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

সুইফট ৪.০ এর জন্য:

String(data: yourData, encoding: .utf8)

3

আমি আপনার "পি" ডেটা উইথবাইটস পরম হিসাবে বিশ্বাস করি

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

"বুফ" হওয়া উচিত

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

যেহেতু i2d_PrivateKey বাফার শেষে আউটপুট বাফার পিতে পয়েন্টার রাখে এবং আরও ইনপুটটির জন্য অপেক্ষা করে, এবং বুফটি এখনও আপনার বাফারের শুরুতে নির্দেশ করছে।

নীচের কোডগুলি আমার জন্য কাজ করে যেখানে পিকেটি একটি ইভিপিপিকেইওয়াইয়ের নির্দেশক:

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 64

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

এরপরে আপনি এটি পুনরায় ব্যবহারের জন্য আপনার ডাটাবেসে সংরক্ষণ করতে পারেন। এটিকে এনএসডিটাতে ডিকোড করুন।


1

সুইফট 5 :

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

এটি কেবল পিয়ের 23 উত্তরটির একটি পরিবর্তিত কপি যা আমার পক্ষে ভাল - আমি কোডটি অনুলিপি করতে সাধারণত এই পৃষ্ঠাটি ব্যবহার করি এবং আপনার ডেটা ডেটাতে সংশোধন করতে হয়েছিল! যে সময় লাগে। এখন আমি এবং আপনি কোনও সংশোধন ছাড়াই অনুলিপি করুন এবং আটকান।
আলেকজান্ডার ভোলকভ

এটি কোনও সুইফ্ট সম্পর্কিত প্রশ্ন নয়। আরও, প্রশ্নের কোড নমুনা হ'ল উদ্দেশ্য-সি কোড। এবং শেষ অবধি না আপনার কোড থেকে জোর করে মোড়ানো অপ্রত্যাশিত ক্রাশ হতে পারে।
ক্রিসটিক

প্রশ্নটি ক্রিশটিক ওবজ-সি হিসাবে ট্যাগ করা হয়নি।
একো

@ আলেকজান্ডারভোলকভ আপনি এর জন্য একটি এক্সকোড স্নিপেট যোগ করতে পারেন, এটি এর চেয়ে আরও দ্রুততর হবে;)
ক্রিশটিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.