将NSString转换为NSData有不同的方法。
NSString *req_string = @"I am a NSString.";
NSData *req_data = [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]];
// or
NSData *req_data_alt = [req_string dataUsingEncoding:NSUTF8StringEncoding];
这两种方法有何不同?
答案 0 :(得分:6)
后者(NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]
)是我推荐的选项。
为什么?
有些人会说效率。在这种情况下,使用字符串实例方法创建NSData对象只需要对Apple的代码进行单个obj-c消息调度,这是高度优化的。在另一种情况下(使用类方法创建一个新的NSData对象)将需要2个消息调度到您的字符串对象和1个消息调度到NSData类对象。但是,运行时不太可能大不相同,即使它们确实如此,编码的成本也将取决于字符串的长度,而不是用于创建NSData对象的方法。
我认为你想在NSString上使用实例方法的真正原因是语义和清晰度。
让我们考虑这些选项的伪英语翻译:
[string DataUsingEncoding:NSUTF8StringEncoding]
:嘿,字符串,我希望您使用UTF8编码给我一张NSData副本。好的,谢谢,把它放在那边 - 不,不是在地毯上。[NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]
:字符串!给我你所有的UTF8字节。是的,哦,我也需要你的长度。秒。 NSData,过来这里,我需要你拿起这个东西字符串离开我的家门口,把它变成一个数据对象,字符串,等待,轻轻一点!不要破坏任何东西“你觉得哪个更清楚?
答案 1 :(得分:4)
您的第一次通话不正确。 [req_string length]
不一定是-UTF8String
的长度(以字节为单位)。您应该使用strlen
来获取-UTF8String
的实际长度。
此示例显示使用-[NSString dataUsingEncoding:]
更好 - 只有少一个参数可以出错。
另请注意:-[NSString dataUsingEncoding:]
的文档声明返回的数据是“外部表示”,意味着要传输到其他计算机,可能包括前面的BOM(字节顺序标记)。实际上,对于UTF8,BOM比无用更差,因此-dataUsingEncoding:
不包括它。如果你要选择不同的编码,你可能会看到它。