ChatGPT解决这个技术问题 Extra ChatGPT

How do I convert an NSString value to NSData?

How do I convert an NSString value to NSData?


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

What are the pros and cons of using UTF-8 as opposed to something higher like UTF-16 or UTF-32?
The NSData doesn't care much about whether it is UTF-8 or UTF-16 or UTF-32. There are two problems: One, UTF-16 and UTF-32 need to have the right byte-ordering. Two, whoever converts it back to an NSString* must know the encoding, and often will assume UTF-8 encoding. Generally, UTF-8 is most likely to be handled correctly.
@bendytree actually no it doesn't, -dataUsingEncoding: will return an non-null-terminated string which is what stringWithUTF8String: requires, you're bounds to read memory you don't want. What converts it back is: -initWithData:encoding:.
@Albert Renshaw currently (no guarantee of things staying this way) NSString uses UTF-16 internally so there might be a slight performance gain because it does not have to do a UTF-16 <-> UTF-8 conversion. Personally, we prefer (as @gnasher729 suggests) robustness over performance and use UTF-8 everywhere.
macOS and my app are not running on big endian cpus, so I prefer utf16.
R
Raptor
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

you can take reference from this link


One liner solution: NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
C
Cœur

Do:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

then feel free to proceed with NSJSONSerialization:JSONObjectWithData.

Correction to the answer regarding the NULL terminator

Following the comments, official documentation, and verifications, this answer was updated regarding the removal of an alleged NULL terminator:

As documented by dataUsingEncoding:: Return Value The result of invoking dataUsingEncoding:allowLossyConversion: with NO as the second argument As documented by getCString:maxLength:encoding: and cStringUsingEncoding:: note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator


This is WRONG! Please see my post here: stackoverflow.com/q/14087094/192819
Yup. dataUsingEncoding: does not return null-terminated data. Only UTF8String and other methods that return a C string return a null-terminated string.
@PeterHosey do you have any source for that? I am having a hard time finding that in any docs.
Thanks @PeterHosey, the docs you linked there do explicitly state the lack of NULL termination -- (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). I must have missed this earlier. I'll be sure to write up anything in the future, though.
(For anyone who's wondering: shortstuffsushi's quote is under cStringUsingEncoding:. I was looking under dataUsingEncoding:.)
S
Sruit A.Suk

In case of Swift Developer coming here,

to convert from NSString / String to NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

S
Shamsiddin Saidov

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

Probably processor-intensive compared to the other methods, but very useful if you're accessing the file system for persistence
M
Michael Mior

First off, you should use dataUsingEncoding: instead of going through UTF8String. You only use UTF8String when you need a C string in that encoding.

Then, for UTF-16, just pass NSUnicodeStringEncoding instead of NSUTF8StringEncoding in your dataUsingEncoding: message.


j
jacks205

For Swift 3, you will mostly be converting from String to Data.

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

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

This answer is wrong when str contains code points larger than 127. This is because str.length gives the number of Unicode characters, not the number of bytes. For example, if str is @"にほんご", str.length gives 4 while str.UTF8String actually contains 12 bytes. Even if you replace str.length by strlen(str.UTF8String), it will still be wrong for the case where str contains the NULL character, such as @"にほ\0んご".
A NSData object created in this way throw exeption when using with [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
N
Nick

Objective-C:

NSString to NSData:

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

NSData to NSString:

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

Swift:

String to Data:

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

Data to String:

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

A
AnLT

Update Swift 5.x

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

A
Anuj Saini

Swift:

Swift 5.x

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

String to Data:

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

Data to String:

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

OBJECTIVE C:

NSString to NSData :

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

NSData to NSString :

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

K
Kamani Jasmin
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

R
Rohit Makwana

Objective-C

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

Swift

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)

v
vadian

In Swift there is an API which returns a non-optional

let str = "teststring"
let data = Data(str.utf8)