如何将 NSString 值转换为 NSData?

How do I convert an NSString value to NSData?

提问人: 提问时间:5/23/2009 最后编辑:Nick 更新时间:11/10/2022 访问量:463789

问:

如何将值转换为?NSStringNSData

iOS Objective-C nsstring nsdata

评论


答:

1448赞 flitzwald 5/23/2009 #1
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

评论

0赞 Albert Renshaw 1/13/2014
与 UTF-16 或 UTF-32 等更高级别的东西相比,使用 UTF-8 的优缺点是什么?
4赞 gnasher729 3/21/2014
NSData 不太关心它是 UTF-8、UTF-16 还是 UTF-32。有两个问题:第一,UTF-16 和 UTF-32 需要有正确的字节排序。第二,无论谁将其转换回 NSString*,都必须知道编码,并且通常采用 UTF-8 编码。通常,UTF-8 最有可能被正确处理。
1赞 Psycho 5/6/2014
@bendytree实际上没有,但 -dataUsingEncoding: 将返回一个非以 null 结尾的字符串,这是 stringWithUTF8String: 所要求的,您可以读取您不想要的内存。将其转换回的是:-initWithData:encoding:。
1赞 Some Developer 10/21/2014
@Albert Renshaw 目前(不能保证事情会保持这种状态)在内部使用 UTF-16,因此可能会有轻微的性能提升,因为它不必进行 UTF-16 <-> UTF-8 转换。就个人而言,我们更喜欢(正如@gnasher729所建议的)健壮性而不是性能,并在任何地方使用 UTF-8。NSString
0赞 Tom 9/17/2021
macOS 和我的应用程序没有在 big endian cpus 上运行,所以我更喜欢 utf16。
35赞 Andrew Kolesnikov 10/26/2011 #2

狐狸

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

然后随意继续。NSJSONSerialization:JSONObjectWithData


更正有关 NULL 终止符的答案

在评论、官方文档和验证之后,此答案已更新,涉及删除所谓的 NULL 终止符:

  1. 正如 dataUsingEncoding 所记录的:

    返回值

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

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

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

评论

14赞 jpswain 12/30/2012
这是错误的!请在这里看我的帖子: stackoverflow.com/q/14087094/192819
4赞 Peter Hosey 12/30/2012
是的。 不返回以 null 结尾的数据。只有返回 C 字符串的方法和其他方法返回以 null 结尾的字符串。dataUsingEncoding:UTF8String
0赞 shortstuffsushi 6/19/2015
@PeterHosey你有这方面的任何来源吗?我很难在任何文档中找到它。
1赞 shortstuffsushi 8/6/2015
谢谢@PeterHosey,您在那里链接的文档确实明确指出缺少 NULL 终止-- .我一定早就错过了。不过,我一定会在将来写任何东西。(note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)
1赞 Peter Hosey 8/21/2015
(对于任何想知道的人:shortstuffsushi 的报价在 .我在下面看。cStringUsingEncoding:dataUsingEncoding:
10赞 Jerry Thomsan 9/13/2012 #3

首先,您应该使用而不是通过 .仅当需要该编码中的字符串时才使用。dataUsingEncoding:UTF8StringUTF8StringC

然后,对于 ,只需传递而不是在您的消息中。UTF-16NSUnicodeStringEncodingNSUTF8StringEncodingdataUsingEncoding:

20赞 Sruit A.Suk 3/3/2015 #4

如果 Swift Developer 来到这里,

从 NSString / String 转换为 NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
68赞 ALOK KUMAR 3/10/2015 #5
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

您可以从此链接中获取参考

评论

4赞 Raptor 5/27/2015
单衬解决方案:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
6赞 Nex Mishra 11/28/2015 #6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

评论

5赞 Pang 2/24/2016
当包含大于 127 的代码点时,此答案是错误的。这是因为给出的是 Unicode 字符数,而不是字节数。例如,if is 给出 4,而实际上包含 12 个字节。即使将 替换为 ,对于包含 NULL 字符的情况,它仍然是错误的,例如 。strstr.lengthstr@"にほんご"str.lengthstr.UTF8Stringstr.lengthstrlen(str.UTF8String)str@"にほ\0んご"
0赞 Blazej SLEBODA 2/3/2017
以这种方式创建的 NSData 对象在与 [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
18赞 Shamsiddin Saidov 3/27/2016 #7

目标-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

评论

0赞 Stephen J 11/29/2017
与其他方法相比,可能占用大量处理器资源,但如果您要访问文件系统以实现持久性,则非常有用
7赞 jacks205 11/1/2016 #8

对于 Swift 3,您主要从 转换为 .StringData

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)
1赞 Kamani Jasmin 4/14/2018 #9
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
0赞 Rohit Makwana 4/17/2018 #10

Objective-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)
7赞 Nick 3/14/2019 #11

目标-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!
5赞 AnLT 6/29/2021 #12

更新 Swift 5.x

let str = "teststring"
let data = str.data(using: .utf8)
0赞 vadian 6/29/2021 #13

在 Swift 中,有一个 API 返回一个非可选的

let str = "teststring"
let data = Data(str.utf8)
4赞 Anuj Saini 7/5/2021 #14

迅速:

Swift 5.x

let myStringToConvert = "My String to Convert in Data"
let myData = myStringToConvert.data(using: .utf8)

字符串到数据:

var myStringToConvert = "My String to Convert in Data"
var myData = myStringToConvert.data(using: String.Encoding.utf8)

数据到字符串:

var backToMyString = String(data: myData!, encoding: String.Encoding.utf8) as String!

目标 C:

NSString 到 NSData:

NSString* myStringToConvert= @"My String to Convert in Data";
NSData* myData=[str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

NSData 到 NSString :

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