Base64-Dekodierung in iOS 7+

184

Ich habe Text ( NSString) mit der NSDataneuen API der Klasse codiert, die in iOS7 hinzugefügt wurde.

mit diesem

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

Hier ist mein Code

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

NSLog(@"%@", base64EncodedString);

Ich möchte es entschlüsseln

Sandeep Khade
quelle
7
m_EncodeText: bitte aufhören
Carl Veazey
1
wo haben Sie gefunden base64EncodedStringWithOptions:?
user2159978
@ user2159978 es ist dort in Apple Docs Developer.apple.com/library/ios/documentation/cocoa/reference/…
Sandeep Khade
Es scheint, dass es passiert, wenn ich das Anwendungsziel der Mac OS-Konsole verwende. Oder die alte Version von sdk / mac os target
user2159978

Antworten:

438

Swift 3+

let plainString = "foo"

Codierung

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

Dekodierung

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

Schnell <3

let plainString = "foo"

Codierung

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

Dekodierung

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

Ziel c

NSString *plainString = @"foo";

Codierung

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

Dekodierung

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

Gabriele Petronella
quelle
1
Ich denke nicht, dass dieser Code sauber ist. Ich erhalte die Warnung: "Inkompatible Zeigertypen, die NNSTring mit einem Ausdruck von NSData initialisieren"
drlobo
9
@drlobo müssen Sie base64EncodedDataWithOptions eingegeben haben: anstelle von base64EncodedStringWithOptions:
Bach
4
Danke dafür. Etwas, das ich gerade gefunden habe: Eine Konstante kNilOptionsist gleich 0, was wohl besser lesbar ist als die Verwendung von 0 für Optionen.
Adam Waite
2
@AdamWaite kNilOptionsist definiert MacTypes.hals ein älterer OSX-Header, daher verwende ich ihn nicht gern, da ich denke, dass der Header vollständig aus dem iOS SDK entfernt werden sollte. Wie auch immer, Sie haben einen Punkt zu sagen, der sehr gut lesbar ist, also zögern Sie nicht, ihn zu verwenden.
Gabriele Petronella
2
Wenn jemand einen Null-Versuch bekommt, hatte NSDataBase64DecodingOptions.IgnoreUnknownCharactersich dieses Problem
spaceMonkey
81

Falls Sie Rückfall - Code zu schreiben, hat Decodierung von Base64 seit dem Anfang in iOS gewesen durch Einschränkung von NSURL:

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

return [NSData dataWithContentsOfURL:URL];
Tommy
quelle
12
Ich bin total beeindruckt von dieser Antwort. Seit Jahren verwende ich eine lächerliche Menge Code, um einen String zu dekodieren, und die ganze Zeit über gab es eine zweizeilige Lösung.
AlBeebe
Das ist fantastisch! Hacky, aber super :)
Micha Mazaheri
Ich hätte nie gedacht, dass es so einfach ist! Vielen Dank!!
Kumar C