950

How do I convert an NSString value to NSData?

0

14 Answers 14

1447
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
5
  • What are the pros and cons of using UTF-8 as opposed to something higher like UTF-16 or UTF-32? Jan 13, 2014 at 2:34
  • 4
    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.
    – gnasher729
    Mar 20, 2014 at 17:50
  • 1
    @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:.
    – Psycho
    May 5, 2014 at 17:38
  • 1
    @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. Oct 21, 2014 at 1:32
  • macOS and my app are not running on big endian cpus, so I prefer utf16.
    – Tom
    Sep 16, 2021 at 19:58
68
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

you can take reference from this link

1
  • 4
    One liner solution: NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
    – Raptor
    May 27, 2015 at 10:22
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

9
  • 14
    This is WRONG! Please see my post here: stackoverflow.com/q/14087094/192819
    – jpswain
    Dec 30, 2012 at 0:06
  • 4
    Yup. dataUsingEncoding: does not return null-terminated data. Only UTF8String and other methods that return a C string return a null-terminated string. Dec 30, 2012 at 1:51
  • @PeterHosey do you have any source for that? I am having a hard time finding that in any docs. Jun 18, 2015 at 18:05
  • 1
    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. Aug 6, 2015 at 14:37
  • 1
    (For anyone who's wondering: shortstuffsushi's quote is under cStringUsingEncoding:. I was looking under dataUsingEncoding:.) Aug 21, 2015 at 5:03
20

In case of Swift Developer coming here,

to convert from NSString / String to NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
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
1
  • Probably processor-intensive compared to the other methods, but very useful if you're accessing the file system for persistence
    – Stephen J
    Nov 28, 2017 at 18:05
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.

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)
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!
6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
2
  • 5
    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んご".
    – Pang
    Feb 24, 2016 at 6:56
  • A NSData object created in this way throw exeption when using with [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]; Feb 3, 2017 at 7:21
5

Update Swift 5.x

let str = "teststring"
let data = str.data(using: .utf8)
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];
0
1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
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)
0

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

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