将 NSData 转换为字符串?

Posted

技术标签:

【中文标题】将 NSData 转换为字符串?【英文标题】:Convert NSData to String? 【发布时间】:2011-09-19 16:25:59 【问题描述】:

我将 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数据库

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

【问题讨论】:

“其他一些角色”是什么意思?是在末尾打印不应该存在的额外字符,还是只是打印与您预期完全不同的字符? 它与现在完全不同 您确定数据实际上是 UTF-8 编码的吗?我对 i2d_PrivateKey 不熟悉,但您的结果表明您没有使用正确的字符串编码。 @TOm:谢谢。它是 ASCII 编码。现在它工作正常 不,您在这里没有走在正确的轨道上,所有答案似乎都不正确。如果要将NSData中的数据转换为NSString,则应使用base64编码。 【参考方案1】:

Objective-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

【讨论】:

感谢您的回复。我已经尝试过了,但没有成功。 在调试器上:po [[NSString alloc] initWithData:myData encoding:4] 即使NSData 可能包含任何字节值,包括 UTF-8 范围之外的值,这个答案怎么可能有很多赞成? 因为这里的人正在将数据响应从服务器转换为字符串。 如果 NSData确实 包含 UTF-8 范围之外的值怎么办?【参考方案2】:

我相信你的“P”是 dataWithBytes 参数

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

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

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

我参考了你的问题和this EVP function site 我的回答。

【讨论】:

【参考方案3】:

Swift 3.0 之前的版本:

String(data: yourData, encoding: NSUTF8StringEncoding)

对于 Swift 4.0:

String(data: yourData, encoding: .utf8)

【讨论】:

【参考方案4】:

Swift 5

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

【讨论】:

这只是 pierre23 答案的修改副本,对我来说更好 - 我通常使用此页面复制代码并且必须将 yourData 修改为数据!这需要时间。现在我和你不加修改地复制粘贴。 这不是一个与 Swift 相关的问题。此外,问题中的代码示例是 Objective-C 代码。最后,从代码中强制解包会导致意外崩溃。 @Cristik 该问题未标记为 Obj-C。 @AlexanderVolkov 你可以为此添加一个 Xcode sn-p,它会比这更快;)【参考方案5】:

斯威夫特 3:

String(data: data, encoding: .utf8)

【讨论】:

【参考方案6】:

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

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

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

【讨论】:

以上是关于将 NSData 转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSString 转换为 NSData?并且数据与字符串内容相同

将 NSData 从 NSURLSession 转换为 JSON

如何将字符串转换为 NSData 以将其传递给 BLE 设备?

以哪种方式存储数据(图像)? NSData、字符串或可转换

将 UTF-8 编码的 NSData 转换为 NSString

将UTF-8编码的NSData转换为NSString