如何将NSString值转换为NSData?


Answers:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

与UTF-16或UTF-32之类的更高版本相比,使用UTF-8的优缺点是什么?
艾伯特·伦肖2014年

4
NSData不太关心它是UTF-8还是UTF-16或UTF-32。存在两个问题:一个,UTF-16和UTF-32需要具有正确的字节顺序。二,将其转换回NSString *的人必须知道编码,并且通常会采用UTF-8编码。通常,UTF-8最有可能被正确处理。
gnasher729 2014年

1
@bendytree实际上不,它不会,-dataUsingEncoding:将返回一个非空终止的字符串,这是stringWithUTF8String:所要求的,您势必会读取不需要的内存。将其转换回去的是:-initWithData:encoding:。
Psycho

1
@Albert Renshaw当前(不能保证一切保持这种状态)在NSString内部使用UTF-16,因此可能会有一点性能提升,因为它不必执行UTF-16 <-> UTF-8转换。就个人而言,我们更喜欢(如@ gnasher729所建议的)健壮性而不是性能,并在各处使用UTF-8。
某些开发人员

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

您可以从此链接获取参考


3
一种班轮解决方案:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Raptor 2015年

32

做:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

然后继续进行NSJSONSerialization:JSONObjectWithData


对有关NULL终止符的答案的更正

经过评论,官方文档和验证后,此答案已针对删除所谓的NULL终止符进行了更新:

  1. dataUsingEncoding所述

    返回值

    dataUsingEncoding:allowLossyConversion:以NO作为第二个参数的调用结果

  2. getCString:maxLength:encoding:cStringUsingEncoding:所记录

    请注意,返回的数据dataUsingEncoding:allowLossyConversion:不是严格的C字符串,因为它没有NULL终止符


14
这是错误的!请在这里查看我的帖子:stackoverflow.com/q/14087094/192819
jpswain 2012年

4
对。dataUsingEncoding:不返回以空值结尾的数据。只有UTF8String和其他返回C字符串的方法才能返回以Null结尾的字符串。
彼得·霍西

@PeterHosey您有任何消息来源吗?我很难在任何文档中找到它。
shortstuffsushi

1
感谢@PeterHosey,您链接到那里的文档确实明确声明缺少NULL终止- (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)。我一定早些错过了。不过,我一定会在将来写任何东西。
shortstuffsushi

1
(对于任何想知道的人:shortstuffsushi的报价都在下面cStringUsingEncoding:。我当时在看下面dataUsingEncoding:。)
Peter Hosey15年

20

如果Swift Developer来到这里,

从NSString / String转换为NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

目标C:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

迅速:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

与其他方法相比,它可能占用大量处理器,但是如果要访问文件系统以实现持久性,则非常有用
Stephen J

10

首先,您应该使用dataUsingEncoding:而不是通过UTF8String。仅UTF8String在需要使用C该编码的字符串时才使用。

然后,对于UTF-16,只需传递NSUnicodeStringEncoding而不是NSUTF8StringEncoding在您的dataUsingEncoding:消息中即可。


7

对于Swift 3,您通常会将转换StringData

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
str包含大于127的代码点时,此答案是错误的。这是因为str.length给出的是Unicode字符数,而不是字节数。例如,如果str@"にほんご",则str.length给出4而str.UTF8String实际上包含12个字节。即使您替换str.lengthstrlen(str.UTF8String),对于str包含NULL字符(例如)的情况仍然是错误的@"にほ\0んご"

与[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];一起使用时,以这种方式创建的NSData对象会抛出异常。
Adobels

2

目标C:

NSString到NSData:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData到NSString:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

迅速:

字符串到数据:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

数据到字符串:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!


0

目标C

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

迅速

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.