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