将NSData转换为String?

时间:2011-06-21 16:05:08

标签: iphone ios sqlite openssl 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数据库

我正走在正确的轨道上吗? 感谢。

6 个答案:

答案 0 :(得分:246)

<强>目标C

您可以使用(参见NSString Class Reference

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

示例:

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

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

  

Returns nil if the initialization fails for some reason (for example if data does not represent valid data for encoding).

之前的Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

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

答案 1 :(得分:23)

之前的Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

对于Swift 4.0:

String(data: yourData, encoding: .utf8)

答案 2 :(得分:3)

我相信你的“P”作为dataWithBytes param

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

使用以下命令并检查mypkey.pem的输出后,您可以使用在线转换器将二进制数据转换为base 64(http://tomeko.net/online_tools/hex_to_base64.php?lang=en)并将其与cert文件中的私钥进行比较: / p>

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

我引用了您的问题,this EVP function site提到了我的答案。

答案 3 :(得分:2)

斯威夫特3:

String(data: data, encoding: .utf8)

答案 4 :(得分:0)

夫特:

String(data: data!, encoding: NSUTF8StringEncoding)

答案 5 :(得分:0)

将任意NSData转换为NSString的简单方法是对其进行base64编码。

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

然后,您可以将其存储到数据库中以便以后重复使用。只需将其解码回NSData。