Décodage Base64 dans iOS 7+

186

J'ai encodé text ( NSString) en utilisant la NSDatanouvelle API de classe qui est ajoutée dans iOS7.

en utilisant ceci

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

voici mon code

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

NSLog(@"%@", base64EncodedString);

Je cherche à le décoder

Sandeep Khade
la source
7
m_EncodeText: s'il vous plaît arrêtez
Carl Veazey
1
où avez-vous trouvé base64EncodedStringWithOptions:?
user2159978
@ user2159978 il est là dans les documents Apple developer.apple.com/library/ios/documentation/cocoa/reference/…
Sandeep Khade
Il semble que cela se produit lorsque j'utilise la cible d'application de la console Mac OS. Ou l'ancienne version de la cible sdk / mac os
user2159978

Réponses:

441

Swift 3+

let plainString = "foo"

Codage

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

Décodage

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

Swift <3

let plainString = "foo"

Codage

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

Décodage

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

Objectif c

NSString *plainString = @"foo";

Codage

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

Décodage

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

Gabriele Petronella
la source
1
Je ne pense pas que ce code soit propre. Je reçois l'avertissement: "types de pointeurs incompatibles initialisant NNSTring avec une expression de NSData"
drlobo
9
@drlobo vous devez avoir tapé base64EncodedDataWithOptions: au lieu de base64EncodedStringWithOptions:
Bach
4
Merci pour cela. Quelque chose que je viens de trouver: une constante kNilOptionsest égale à 0, ce qui est sans doute plus lisible que l'utilisation de 0 pour les options.
Adam Waite
2
@AdamWaite kNilOptionsest défini dans MacTypes.hlequel se trouve un en-tête OSX hérité, donc je n'aime pas l'utiliser, car je pense que cet en-tête devrait être complètement supprimé du SDK iOS. Quoi qu'il en soit, vous avez raison de dire que c'est très lisible, alors n'hésitez pas à l'utiliser.
Gabriele Petronella
2
si quelqu'un obtient un essai nul, NSDataBase64DecodingOptions.IgnoreUnknownCharactersj'ai eu ce problème
spaceMonkey
81

Dans le cas où vous souhaitez écrire du code de secours, le décodage à partir de base64 est présent dans iOS depuis le tout début, en mettant en garde NSURL:

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

return [NSData dataWithContentsOfURL:URL];
Tommy
la source
12
Je suis totalement impressionné par cette réponse. Pendant des années, j'utilise une quantité ridicule de code pour décoder une chaîne, et depuis le début, il y avait une solution à 2 lignes.
AlBeebe
C'est génial! Hacky, mais génial :)
Micha Mazaheri
Je n'ai jamais pensé que c'était si facile! Merci!!
Kumar C