Decodifica Base64 in iOS 7+


184

Ho testo codificato ( NSString) utilizzando la NSDatanuova API Class che viene aggiunta in iOS7.

usando questo

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

ecco il mio codice

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

NSLog(@"%@", base64EncodedString);

Sto cercando di decodificarlo


7
m_EncodeText: per favore, fermati
Carl Veazey,

1
dove hai trovato base64EncodedStringWithOptions:?
user2159978

@ user2159978 è disponibile in Apple
Docs

Sembra che accada quando uso il target dell'applicazione console mac os. O la vecchia versione di sdk / mac os target
user2159978

Risposte:


438

Swift 3+

let plainString = "foo"

Codifica

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

decodifica

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

Swift <3

let plainString = "foo"

Codifica

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

decodifica

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

Objective-C

NSString *plainString = @"foo";

Codifica

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

decodifica

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


1
Non credo che questo codice sia pulito. Ricevo l'avvertimento: "tipi di puntatore incompatibili che inizializzano NNSTring con un'espressione di NSData"
drlobo,

9
@drlobo devi aver digitato base64EncodedDataWithOptions: invece di base64EncodedStringWithOptions:
Bach,

4
Grazie per questo. Qualcosa che ho appena trovato: una costante kNilOptionsè uguale a 0 che è probabilmente più leggibile rispetto all'uso di 0 per le opzioni.
Adam Waite,

2
@AdamWaite kNilOptionsè definito in MacTypes.hquale è un'intestazione OSX legacy, quindi non mi piace usarla, poiché penso che l'intestazione debba essere rimossa del tutto dall'SDK di iOS. Ad ogni modo, hai ragione di dire che è molto leggibile, quindi sentiti libero di usarlo.
Gabriele Petronella,

2
se qualcuno ottiene un nulla prova NSDataBase64DecodingOptions.IgnoreUnknownCharactersho avuto questo problema
spaceMonkey il

81

Nel caso in cui si desideri scrivere un codice di fallback, la decodifica da base64 è stata presente in iOS sin dall'inizio con un avvertimento di NSURL:

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

return [NSData dataWithContentsOfURL:URL];

12
Sono totalmente impressionato da questa risposta. Per anni ho usato una quantità ridicola di codice per decodificare una stringa, e da sempre c'era una soluzione a 2 righe.
AlBeebe,

Questo e spettacolare! Hacky, ma fantastico :)
Micha Mazaheri

Non ho mai pensato che sia così facile! Grazie!!
Kumar C,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.