Dekodowanie Base64 w iOS 7+

184

Mam zakodowany tekst ( NSString) przy użyciu NSDatanowego API klasy, który został dodany w iOS7.

używając tego

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

oto mój kod

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

NSLog(@"%@", base64EncodedString);

Chcę to rozszyfrować

Sandeep Khade
źródło
7
m_EncodeText: proszę przestań
Carl Veazey
1
gdzie znalazłeś base64EncodedStringWithOptions:?
user2159978
@ user2159978 jest tam w Apple
Docs
Wygląda na to, że zdarza się, gdy używam docelowej aplikacji konsoli Mac OS. Lub stara wersja sdk / mac OS target
user2159978

Odpowiedzi:

438

Swift 3+

let plainString = "foo"

Kodowanie

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

Rozszyfrowanie

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

Szybki <3

let plainString = "foo"

Kodowanie

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

Rozszyfrowanie

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

Cel C

NSString *plainString = @"foo";

Kodowanie

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

Rozszyfrowanie

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

Gabriele Petronella
źródło
1
Nie sądzę, aby ten kod był czysty. Pojawia się ostrzeżenie: „niezgodne typy wskaźników inicjujące NNSTring z wyrażeniem NSData”
drlobo,
9
@drlobo musisz wpisać base64EncodedDataWithOptions: zamiast base64EncodedStringWithOptions:
Bach
4
Dzięki za to. Coś, co właśnie znalazłem: stała kNilOptionsjest równa 0, co jest prawdopodobnie bardziej czytelne niż użycie 0 dla opcji.
Adam Waite
2
@AdamWaite kNilOptionsjest zdefiniowane w MacTypes.hktórym jest starszym nagłówkiem OSX, więc nie lubię go używać, ponieważ uważam, że nagłówek powinien zostać całkowicie usunięty z zestawu iOS SDK. W każdym razie masz rację mówiąc, że jest to bardzo czytelne, więc możesz go używać.
Gabriele Petronella
2
jeśli ktoś dostanie zero, NSDataBase64DecodingOptions.IgnoreUnknownCharactersmiałem ten problem
spaceMonkey
81

Jeśli chcesz napisać kod zastępczy, dekodowanie z base64 jest obecne w iOS od samego początku, z zastrzeżeniem NSURL:

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

return [NSData dataWithContentsOfURL:URL];
Tommy
źródło
12
Jestem pod wrażeniem tej odpowiedzi. Od lat używam niedorzecznej ilości kodu do dekodowania łańcucha i przez cały czas istniało rozwiązanie 2-liniowe.
AlBeebe
To jest niesamowite! Hacky, ale super :)
Micha Mazaheri
Nigdy nie myślałem, że to takie proste! Dzięki!!
Kumar C