web-dev-qa-db-ja.com

NSDataを文字列に変換しますか?

OpenSSL秘密鍵EVP_PKEYをnsdataとして保存しています。このために、私は以下のコードを使用してバイトストリームにシリアル化しています

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

pkeyのタイプはEVP_PKEYです。次に、次の行を使用して、バッファ 'p'からのバイトをNSDataとして保存しています

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

今、私はそれを以下のコードを使用してNSStringに変換していますが、コンソールに印刷すると、他の文字が表示されます。

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

誰か助けてもらえますか?

基本的に、EVP_PKEYをsqliteデータベースに保存したい

私は正しい軌道に乗っていますか?ありがとう。

113
Zach

Objective-C

使用できます( NSStringクラスリファレンス を参照)

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

例:

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

注釈NSDataの値は、指定されたエンコーディング(上記の例ではUTF-8)に対して有効でなければならないことに注意してください。そうでない場合はnilが返されます:

何らかの理由で初期化が失敗した場合(たとえば、データがエンコードに有効なデータを表していない場合)nilを返します。

Prior Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

String#init(data:encoding :) Reference を参照してください

246
louiscoquio

前のSwift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

For Swift 4.0:

String(data: yourData, encoding: .utf8)
23
pierre23

DataWithBytesパラメータとしての「P」を信じます

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

「buf」である必要があります

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

i2d_PrivateKeyは出力バッファーpへのポインターをバッファーの最後に置き、さらに入力を待機するため、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);

オンラインコンバーターを使用してバイナリデータをBase 64に変換し( http://tomeko.net/online_tools/hex_to_base64.php?lang=en )、証明書の秘密キーと比較できます次のコマンドを使用してmypkey.pemの出力を確認した後のファイル:

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

私はあなたの質問と このEVP機能サイト を参照して回答を求めました。

3

スウィフト3:

String(data: data, encoding: .utf8)
2
Travis M.

任意のNSDataをNSStringに変換する簡単な方法は、base64でエンコードすることです。

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

その後、後で再利用するためにデータベースに保存できます。 NSDataにデコードするだけです。

0
Billy

迅速:

String(data: data!, encoding: NSUTF8StringEncoding)
0