How do I convert an NSString value to NSData?
Asked Answered
R

14

950

How do I convert an NSString value to NSData?

Repartition answered 23/5, 2009 at 11:20 Comment(0)
T
1447
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
Tray answered 23/5, 2009 at 11:34 Comment(5)
What are the pros and cons of using UTF-8 as opposed to something higher like UTF-16 or UTF-32?Instruction
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.Meitner
@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:.Masseur
@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 @Meitner suggests) robustness over performance and use UTF-8 everywhere.Vertebra
macOS and my app are not running on big endian cpus, so I prefer utf16.Tratner
M
68
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

you can take reference from this link

Montelongo answered 10/3, 2015 at 12:39 Comment(1)
One liner solution: NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];Make
A
35

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:

  1. As documented by dataUsingEncoding::

    Return Value

    The result of invoking dataUsingEncoding:allowLossyConversion: with NO as the second argument

  2. 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

Ariannaarianne answered 25/10, 2011 at 19:47 Comment(9)
This is WRONG! Please see my post here: https://mcmap.net/q/54525/-does-converting-nsstring-to-nsdata-force-a-trailing-byte/192819Janot
Yup. dataUsingEncoding: does not return null-terminated data. Only UTF8String and other methods that return a C string return a null-terminated string.Lakeishalakeland
@PeterHosey do you have any source for that? I am having a hard time finding that in any docs.Bewick
@shortstuffsushi: The methods that take or return a C string are expressly documented so; for example: developer.apple.com/library/mac/documentation/Cocoa/Reference/… You can verify this for other methods, such as dataUsingEncoding:, by inspecting the data's length and bytes. (Note that some encodings, such as UTF-16, will emit 0x00 bytes! But those aren't terminators; they're part of larger code units. And it is possible to have a U+0000, which will be encoded as such, but is not a terminator.)Lakeishalakeland
@Bewick To wit: const unichar buffer[1] = { 0x0000 }; NSString *string = [NSString stringWithCharacters:buffer length:1]; NSData *data = [string dataUsingEncoding:NSUTF16BigEndianStringEncoding]; NSLog(@"%lu %@", (unsigned long int)data.length, data);Lakeishalakeland
@Bewick And please do file bugs against the docs: bugreport.apple.comLakeishalakeland
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.Bewick
(For anyone who's wondering: shortstuffsushi's quote is under cStringUsingEncoding:. I was looking under dataUsingEncoding:.)Lakeishalakeland
@Janot the author of the post didn't visit StackOverflow in the past 4 years and the score of the answer is too high for a reversal, so I've made a clear correction directly. Maybe users with 20,000+ reputation could vote to delete the answer, as what is left correct is duplicate information from other answers.Pentameter
S
20

In case of Swift Developer coming here,

to convert from NSString / String to NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
Sulky answered 3/3, 2015 at 15:28 Comment(0)
M
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
Mighell answered 26/3, 2016 at 23:3 Comment(1)
Probably processor-intensive compared to the other methods, but very useful if you're accessing the file system for persistenceElaineelam
F
10

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.

Flaxman answered 13/9, 2012 at 8:2 Comment(0)
S
7

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)
Starry answered 1/11, 2016 at 7:59 Comment(0)
M
7

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!
Milkmaid answered 14/3, 2019 at 8:30 Comment(0)
G
6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
Garrot answered 27/11, 2015 at 17:46 Comment(2)
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んご".Discobolus
A NSData object created in this way throw exeption when using with [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];Obtain
D
5

Update Swift 5.x

let str = "teststring"
let data = str.data(using: .utf8)
Distich answered 29/6, 2021 at 4:22 Comment(0)
R
4

Swift:

Swift 5.x

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

String to Data:

var myStringToConvert = "My String to Convert in Data"
var myData = myStringToConvert.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];
Rentfree answered 5/7, 2021 at 10:43 Comment(0)
R
1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
Raddie answered 13/4, 2018 at 21:37 Comment(0)
S
0

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)
Suiter answered 17/4, 2018 at 6:19 Comment(0)
X
0

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

let str = "teststring"
let data = Data(str.utf8)
Xerophthalmia answered 29/6, 2021 at 4:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.