将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)