将NSData转换为string?

我将一个openssl私钥EVP_PKEY存储为nsdata。 为此,我使用下面的代码序列化成一个字节stream

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

其中pkey是EVP_PKEYtypes。 然后,我使用下面给出的行将缓冲区'p'中的字节存储为NSData

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

现在我使用下面给出的代码将其转换为NSString,但是当我将其打印到控制台中时,会给出其他字符。

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

有人可以帮忙吗?

基本上我想将EVP_PKEY存储到一个sqlite数据库

我在正确的轨道上? 谢谢。

Objective-C的

您可以使用(请参阅NSString类参考 )

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

例如:

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

备注 :请注意, NSData值必须对指定的编码(上例中的UTF-8)有效,否则将返回nil

如果由于某种原因初始化失败,则返回nil(例如,如果数据不代表编码的有效数据)。

之前的Swift 3.0

 String(data: yourData, encoding: NSUTF8StringEncoding) 

Swift 3.0

 String(data: yourData, encoding: .utf8) 

请参阅String#init(data:encoding :)参考

之前的Swift 3.0:

 String(data: yourData, encoding: NSUTF8StringEncoding) 

对于Swift 3.0:

 String(data: yourData, encoding: .utf8) 

我相信你的“P”作为dataWithBytes参数

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

应该是“buf”

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

因为i2d_PrivateKey将指针放在输出缓冲区p的末尾并等待进一步的input,而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 ),并使用以下命令将其与cert文件中的私钥进行比较检查mypkey.pem的输出:

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

我引用你的问题和这个EVPfunction网站为我的答案。

Swift 3:

 String(data: data, encoding: .utf8) 

迅速:

 String(data: data!, encoding: NSUTF8StringEncoding)