186

I have Encoded text(NSString) using NSData Class new API which is Added in iOS7.

using this

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;  

here is my code

NSString *base64EncodedString = [[myText dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];

NSLog(@"%@", base64EncodedString);

I am looking to decode it

4
  • 7
    m_EncodeText: please stop Commented Sep 30, 2013 at 7:04
  • 1
    where have you found base64EncodedStringWithOptions:? Commented Mar 11, 2014 at 6:35
  • @user2159978 it's there in apple docs developer.apple.com/library/ios/documentation/cocoa/reference/… Commented Mar 11, 2014 at 6:48
  • It seems It happens when I use mac os console application target. Or the old version of sdk/mac os target Commented Mar 11, 2014 at 7:08

3 Answers 3

445

Swift 3+

let plainString = "foo"

Encoding

let plainData = plainString.data(using: .utf8)
let base64String = plainData?.base64EncodedString()
print(base64String!) // Zm9v

Decoding

if let decodedData = Data(base64Encoded: base64String!),
   let decodedString = String(data: decodedData, encoding: .utf8) {
  print(decodedString) // foo
}

Swift < 3

let plainString = "foo"

Encoding

let plainData = plainString.dataUsingEncoding(NSUTF8StringEncoding)
let base64String = plainData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
print(base64String!) // Zm9v

Decoding

let decodedData = NSData(base64EncodedString: base64String!, options: NSDataBase64DecodingOptions(rawValue: 0))
let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding)
print(decodedString) // foo

Objective-C

NSString *plainString = @"foo";

Encoding

NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [plainData base64EncodedStringWithOptions:0];
NSLog(@"%@", base64String); // Zm9v

Decoding

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", decodedString); // foo 

Sign up to request clarification or add additional context in comments.

11 Comments

@drlobo you must have typed base64EncodedDataWithOptions: instead of base64EncodedStringWithOptions:
Thanks for this. Something I just found: a constant kNilOptions is equal to 0 which is arguably more readable than using 0 for options.
@AdamWaite kNilOptions is defined in MacTypes.h which is a legacy OSX header, so I don't like using it, since I think that header should be removed from the iOS SDK altogether. Anyway, you have a point in saying that is very readable, so feel free to use it.
base64 decoding works only if the string length is a multiple of 4. otherwise NSData returns nil.
if anyone getting a nil try NSDataBase64DecodingOptions.IgnoreUnknownCharacters i had this issue
|
82

In case you want to write fallback code, decoding from base64 has been present in iOS since the very beginning by caveat of NSURL:

NSURL *URL = [NSURL URLWithString:
      [NSString stringWithFormat:@"data:application/octet-stream;base64,%@",
           base64String]];

return [NSData dataWithContentsOfURL:URL];

2 Comments

I'm totally impressed with this answer. For years i've been using some ridiculous amount of code to decode a string, and all along there was a 2 line solution.
This is awesome! Hacky, but awesome :)
1

While decoding the base64String I was getting nil for using:

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];

So, I used:

NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:NSDataBase64DecodingIgnoreUnknownCharacters];

And it worked for me.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.