如何将NSString值转换为NSData?

950

如何将NSString类型的值转换为NSData类型?

14个回答

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

使用UTF-8相对于使用更高的UTF-16或UTF-32有哪些优缺点? - Albert Renshaw
4
NSData并不太在意它是UTF-8还是UTF-16或UTF-32。存在两个问题:一,UTF-16和UTF-32需要正确的字节序。二,将其转换回NSString*的人必须知道编码,并且通常会假定为UTF-8编码。一般情况下,UTF-8最有可能被正确处理。 - gnasher729
1
@bendytree 实际上并不是这样的,-dataUsingEncoding: 会返回一个非空结尾的字符串,这正是stringWithUTF8String:所需的,你可能会读取不想要的内存。将其转换回来的方法是:-initWithData:encoding:。 - Psycho
1
@Albert Renshaw 目前(事情不一定会保持这样)NSString 内部使用 UTF-16,因此可能会略微提高性能,因为它不必进行 UTF-16 <-> UTF-8 转换。个人而言,我们更喜欢(如 @gnasher729 所建议的)健壮性胜过性能,并且在任何地方都使用 UTF-8。 - Some Developer
我的应用程序和 macOS 不能在 big endian 的 CPU 上运行,因此我更喜欢使用 utf16。 - Tom

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

你可以参考这个链接

的内容,将NSString转换为NSData并再次转换回去。


4
一行解决方案:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding]; - Raptor

35

做:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

如果您遵循评论、官方文档和验证,可以对答案进行更正,因为据称已删除了NULL终止符:

  1. dataUsingEncoding:所述:

    返回值

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

  2. getCString:maxLength:encoding:cStringUsingEncoding:所述:

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


14
这是错误的!请看我在这里发的帖子:https://dev59.com/8GYq5IYBdhLWcg3w7E0F - jpswain
4
是的,dataUsingEncoding:不会返回以空字符结尾的数据。只有UTF8String和其他返回C字符串的方法才会返回以空字符结尾的字符串。 - Peter Hosey
@shortstuffsushi:那些接受或返回C字符串的方法都有明确的文档说明,例如:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/occ/instp/NSString/UTF8String 你可以通过检查数据的长度和字节来验证其他方法,比如dataUsingEncoding:。(请注意,某些编码,如UTF-16,会发出0x00字节!但这些不是终止符;它们是更大的代码单元的一部分。并且可能会有一个U+0000,它将被编码为这样,但不是终止符。) - Peter Hosey
1
感谢@PeterHosey,您提供的文档确实明确说明了缺乏NULL终止符-- (请注意,由dataUsingEncoding:allowLossyConversion:返回的数据不是严格的C字符串,因为它没有NULL终止符). 我之前可能错过了这个。但我会确保将来仔细查看并记录好一切。 - shortstuffsushi
1
对于任何想知道的人:shortstuffsushi的引用在cStringUsingEncoding:下面。我一直在寻找dataUsingEncoding: - Peter Hosey
显示剩余4条评论

20

如果有Swift开发人员来到这里,

将NSString/String转换为NSData:

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objective-C:

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

Swift:

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

可能与其他方法相比,这种方法对处理器要求较高,但如果你需要访问文件系统进行持久化操作,它非常有用。 - Stephen J

10

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

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


7

对于Swift 3,您需要将String转换为Data

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

7

Objective-C:

将NSString转换为NSData:

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

NSData转换成NSString:

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

Swift:

字符串转换为数据(Data):

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

数据转字符串:

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

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个字节。即使你用strlen(str.UTF8String)替换str.length,对于包含NULL字符(如@"にほ\0んご")的情况仍然是错误的。 - Pang
使用此方式创建的NSData对象在与[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];一起使用时会抛出异常。 - Blazej SLEBODA

5

更新Swift 5.x版本

let str = "teststring"
let data = str.data(using: .utf8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接