Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSData from NSKeyedArchiver to NSString

I'm trying to convert NSData generated from NSKeyedArchiver to an NSString so that I can pass it around and eventually convert it back to NSData. I have to pass this as a string (I'm using three20 URL passing). I've gone through various encodings, UTF8, ASCII, etc. and can't get anything to work. NSKeyedArchiver says that the NSData is formated as a property list: NSPropertyListBinaryFormat_v1_0.

Does anyone have any idea how I can convert this NSData to a String and back again? Size of the string isn't an issue.

Thanks

like image 759
kodai Avatar asked May 23 '11 22:05

kodai


2 Answers

What you want is:

id<nscoding> obj;

NSData * data     = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSString * string = [data base64EncodedString];

And then the other way around

NSString * string;

NSData * data    = [NSData dataFromBase64String:string];
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]

You can add base64EncodedString and dataFromBase64String: with the NSData category available here NSData+Base64 but it is now included by default

like image 149
Nicolas Manzini Avatar answered Nov 11 '22 07:11

Nicolas Manzini


iOS 9.2.1, Xcode 7.2.1, ARC enabled

base64EncodedString, dataFromBase64String: depreciated after iOS 7.0

Updated solution:

Encode to string:

id<nscoding> obj;

NSData *data     = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSString *string = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

Decode to data:

NSString *string;

NSData *data    = [[NSData alloc] initWithBase64EncodedString:string options:(NSDataBase64DecodingIgnoreUnknownCharacters)];
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Note: This is very useful when working with keychain to store a dictionary of key/value pairs into kSecValueData.

Hope this helps someone! Cheers.

like image 28
serge-k Avatar answered Nov 11 '22 07:11

serge-k