如何将NSString
类型的值转换为NSData
类型?
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
你可以参考这个链接
的内容,将NSString转换为NSData并再次转换回去。NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
- Raptor做:
NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
如果您遵循评论、官方文档和验证,可以对答案进行更正,因为据称已删除了NULL终止符:
返回值
使用 NO 作为第二个参数调用
dataUsingEncoding:allowLossyConversion:
的结果。
如getCString:maxLength:encoding: 和 cStringUsingEncoding:所述:
请注意,
dataUsingEncoding:allowLossyConversion:
返回的数据不是严格的 C 字符串,因为它没有 NULL 终止符。
dataUsingEncoding:
不会返回以空字符结尾的数据。只有UTF8String
和其他返回C字符串的方法才会返回以空字符结尾的字符串。 - Peter HoseydataUsingEncoding:
。(请注意,某些编码,如UTF-16,会发出0x00字节!但这些不是终止符;它们是更大的代码单元的一部分。并且可能会有一个U+0000,它将被编码为这样,但不是终止符。) - Peter Hosey(请注意,由dataUsingEncoding:allowLossyConversion:返回的数据不是严格的C字符串,因为它没有NULL终止符)
. 我之前可能错过了这个。但我会确保将来仔细查看并记录好一切。 - shortstuffsushicStringUsingEncoding:
下面。我一直在寻找dataUsingEncoding:
。 - Peter Hosey如果有Swift开发人员来到这里,
将NSString/String转换为NSData:
var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
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
首先,您应该使用dataUsingEncoding:
而不是使用UTF8String
。只有在需要该编码的C
字符串时才使用UTF8String
。
然后,对于UTF-16
,只需在dataUsingEncoding:
消息中传递NSUnicodeStringEncoding
而不是NSUTF8StringEncoding
即可。
对于Swift 3,您需要将String
转换为Data
。
let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)
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!
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
str
包含大于127的码点,那么这个答案是错误的。这是因为str.length
返回Unicode字符数,而不是字节数。举个例子,如果str
是@"にほんご"
,str.length
返回4,而str.UTF8String
实际上包含12个字节。即使你用strlen(str.UTF8String)
替换str.length
,对于包含NULL字符(如@"にほ\0んご"
)的情况仍然是错误的。 - Pang更新Swift 5.x版本
let str = "teststring"
let data = str.data(using: .utf8)
NSString
内部使用 UTF-16,因此可能会略微提高性能,因为它不必进行 UTF-16 <-> UTF-8 转换。个人而言,我们更喜欢(如 @gnasher729 所建议的)健壮性胜过性能,并且在任何地方都使用 UTF-8。 - Some Developer