Decodificación Base64 en iOS 7+

184

He codificado el texto ( NSString) usando la NSDatanueva API de clase que se agrega en iOS7.

usando esto

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

aqui esta mi codigo

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

NSLog(@"%@", base64EncodedString);

Estoy buscando decodificarlo

Sandeep Khade
fuente
77
m_EncodeText: por favor pare
Carl Veazey
1
¿dónde has encontrado base64EncodedStringWithOptions:?
user2159978
@ user2159978 está allí en apple docs developer.apple.com/library/ios/documentation/cocoa/reference/…
Sandeep Khade
Parece que sucede cuando uso el objetivo de la aplicación de consola mac os. O la versión anterior de sdk / mac os target
user2159978

Respuestas:

438

Swift 3+

let plainString = "foo"

Codificación

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

Descodificación

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

Swift <3

let plainString = "foo"

Codificación

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

Descodificación

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

C objetivo

NSString *plainString = @"foo";

Codificación

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

Descodificación

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

Gabriele Petronella
fuente
1
No creo que este código esté limpio. Recibo la advertencia: "tipos de puntero incompatibles que inicializan NNSTring con una expresión de NSData"
drlobo
9
@drlobo debe haber escrito base64EncodedDataWithOptions: en lugar de base64EncodedStringWithOptions:
Bach
44
Gracias por esto. Algo que acabo de encontrar: una constante kNilOptionses igual a 0, que podría decirse que es más legible que usar 0 para las opciones.
Adam Waite
2
@AdamWaite kNilOptionsse define en MacTypes.hun encabezado OSX heredado, por lo que no me gusta usarlo, ya que creo que ese encabezado debería eliminarse por completo del SDK de iOS. De todos modos, tiene un punto para decir que es muy legible, así que siéntase libre de usarlo.
Gabriele Petronella
2
si alguien tiene un intento nulo, NSDataBase64DecodingOptions.IgnoreUnknownCharacterstuve este problema
spaceMonkey
81

En caso de que desee escribir código de reserva, la decodificación desde base64 ha estado presente en iOS desde el principio por advertencia de NSURL:

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

return [NSData dataWithContentsOfURL:URL];
Tommy
fuente
12
Estoy totalmente impresionado con esta respuesta. Durante años he estado usando una cantidad ridícula de código para decodificar una cadena, y todo el tiempo había una solución de 2 líneas.
AlBeebe
¡Esto es asombroso! Hacky, pero increíble :)
Micha Mazaheri
¡Nunca pensé que es tan fácil! ¡¡Gracias!!
Kumar C