繁体   English   中英

将 NSData 转换为字符串?

[英]Convert NSData to 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_PKEY 类型。 然后我使用下面给出的行将缓冲区“p”中的字节存储为 NSData

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

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

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

有人可以帮忙吗?

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

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

Objective-C

您可以使用(参见NSString Class 参考

- (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 4.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 将指向 output 缓冲区 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 的 output:

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

我参考了你的问题和这个 EVP function 网站作为我的回答。

Swift 5

String(data: data!, encoding: String.Encoding.utf8)

Swift 3:

String(data: data, encoding: .utf8)

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

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

然后您可以将其存储到您的数据库中以供以后重用。 只需将其解码回 NSData。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM