Decodificação Base64 no iOS 7 ou superior

184

Eu codifiquei text ( NSString) usando a NSDatanova API de classe que é adicionada no iOS7.

usando isso

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

aqui está o meu código

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

NSLog(@"%@", base64EncodedString);

Eu estou olhando para decodificá-lo

Sandeep Khade
fonte
7
m_EncodeText: por favor pare
Carl Veazey
1
onde você encontrou base64EncodedStringWithOptions:?
user2159978
@ user2159978 ele está lá em docs maçã developer.apple.com/library/ios/documentation/cocoa/reference/...
Sandeep Khade
Parece que acontece quando eu uso o destino do aplicativo de console do Mac OS. Ou a versão antiga do sdk / mac os target
user2159978

Respostas:

438

Swift 3+

let plainString = "foo"

Codificação

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

Decodificação

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

Swift <3

let plainString = "foo"

Codificação

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

Decodificação

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

Objetivo-C

NSString *plainString = @"foo";

Codificação

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

Decodificação

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

Gabriele Petronella
fonte
1
Eu não acho que esse código esteja limpo. Recebo o aviso: "tipos de ponteiros incompatíveis inicializando NNSTring com uma expressão de NSData"
drlobo 26/11/13
9
@drlobo, você deve ter digitado base64EncodedDataWithOptions: em vez de base64EncodedStringWithOptions:
Bach
4
Obrigado por isso. Algo que eu acabei de encontrar: uma constante kNilOptionsé igual a 0, que é sem dúvida mais legível do que usar 0 para opções.
Adam Waite
2
O @AdamWaite kNilOptionsé definido MacTypes.hcomo um cabeçalho OSX herdado, por isso não gosto de usá-lo, pois acho que esse cabeçalho deve ser removido completamente do SDK do iOS. De qualquer forma, você tem razão em dizer que é muito legível; portanto, fique à vontade para usá-lo.
Gabriele Petronella
2
se alguém conseguir um nulo tentar NSDataBase64DecodingOptions.IgnoreUnknownCharactersi tive esse problema
spacemonkey
81

Caso você queira escrever código de fallback, a decodificação da base64 está presente no iOS desde o início, com a ressalva de NSURL:

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

return [NSData dataWithContentsOfURL:URL];
Tommy
fonte
12
Estou totalmente impressionado com esta resposta. Por anos eu tenho usado uma quantidade ridícula de código para decodificar uma string, e o tempo todo houve uma solução de 2 linhas.
AlBeebe
Isso é incrível! Hacky, mas :) incrível
Micha Mazaheri
Eu nunca pensei que é tão fácil! Obrigado!!
Kumar C