Wie kann ich in Swift einen String in Base64 codieren?

115

Ich möchte einen String in Base64 konvertieren. Ich habe an mehreren Stellen Antworten gefunden, aber in Swift funktioniert es nicht mehr. Ich benutze Xcode 6.2. Ich glaube, die Antwort könnte in früheren Xcode-Versionen und nicht in Xcode 6.2 funktionieren.

Könnte mich bitte jemand anleiten, dies in Xcode 6.2 zu tun?

Die Antwort, die ich gefunden habe, war folgende, aber sie funktioniert in meiner Version von Xcode nicht:

var str = "iOS Developer Tips encoded in Base64"
println("Original: \(str)")

// UTF 8 str from original
// NSData! type returned (optional)
let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding)

// Base64 encode UTF 8 string
// fromRaw(0) is equivalent to objc 'base64EncodedStringWithOptions:0'
// Notice the unwrapping given the NSData! optional
// NSString! returned (optional)
let base64Encoded = utf8str.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
println("Encoded:  \(base64Encoded)")

// Base64 Decode (go back the other way)
// Notice the unwrapping given the NSString! optional
// NSData returned
let data = NSData(base64EncodedString: base64Encoded, options:   NSDataBase64DecodingOptions.fromRaw(0)!)

// Convert back to a string
let base64Decoded = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Decoded:  \(base64Decoded)")

Ref: http://iosdevelopertips.com/swift-code/base64-encode-decode-swift.html

Ankahathara
quelle
Die schnelle Erweiterung ist sauber und praktisch. stackoverflow.com/a/46969102/1996294
Ashok

Antworten:

68

Ich habe 6.2 nicht installiert, aber ich denke nicht, dass 6.3 in dieser Hinsicht anders ist:

dataUsingEncoding Gibt eine Option zurück, daher müssen Sie diese auspacken.

NSDataBase64EncodingOptions.fromRawwurde ersetzt durch NSDataBase64EncodingOptions(rawValue:). Es ist etwas überraschend, dass dies kein fehlerhafter Initialisierer ist, sodass Sie ihn nicht auspacken müssen.

Da es sich jedoch NSData(base64EncodedString:) um einen fehlerhaften Initialisierer handelt, müssen Sie diesen auspacken.

Übrigens wurden alle diese Änderungen vom Xcode-Migrator vorgeschlagen (klicken Sie auf die Fehlermeldung in der Gosse und es gibt einen "Fix-it" -Vorschlag).

Der endgültige Code, der neu geschrieben wurde, um ein gewaltsames Auspacken zu vermeiden, sieht folgendermaßen aus:

import Foundation

let str = "iOS Developer Tips encoded in Base64"
println("Original: \(str)")

let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding)

if let base64Encoded = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
{

    println("Encoded:  \(base64Encoded)")

    if let base64Decoded = NSData(base64EncodedString: base64Encoded, options:   NSDataBase64DecodingOptions(rawValue: 0))
                          .map({ NSString(data: $0, encoding: NSUTF8StringEncoding) })
    {
        // Convert back to a string
        println("Decoded:  \(base64Decoded)")
    }
}

(Wenn Sie Swift 1.2 verwenden, können Sie anstelle der Karte mehrere If-Lets verwenden.)

Swift 5 Update:

import Foundation

let str = "iOS Developer Tips encoded in Base64"
print("Original: \(str)")

let utf8str = str.data(using: .utf8)

if let base64Encoded = utf8str?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) {
    print("Encoded: \(base64Encoded)")

    if let base64Decoded = Data(base64Encoded: base64Encoded, options: Data.Base64DecodingOptions(rawValue: 0))
    .map({ String(data: $0, encoding: .utf8) }) {
        // Convert back to a string
        print("Decoded: \(base64Decoded ?? "")")
    }
}
Fluggeschwindigkeit
quelle
3
Kannst du nicht einfach []statt NSDataBase64EncodingOptions(rawValue: 0)?
Schwefel
198

Schnell

import Foundation

extension String {

    func fromBase64() -> String? {
        guard let data = Data(base64Encoded: self) else {
            return nil
        }

        return String(data: data, encoding: .utf8)
    }

    func toBase64() -> String {
        return Data(self.utf8).base64EncodedString()
    }

}
Darkngs
quelle
Dies ist in sicherem Code, müssen Sie Optionen behandeln.
Mohammad Zaid Pathan
Swift 3 Syntax hinzugefügt
Matthew Knippen
3
Ich habe versucht, diese 64-Zeichenfolge zu konvertieren: dfYcSGpvBqyzvkAXkdbHDA==und die erwartete Ausgabe musste sein: u�Hjo���@���Die obige Funktion gibt jedoch null zurück. Sie können die Ausgabe der obigen Base-64-Zeichenfolge auf diesen Sites überprüfen : Site1 , Site2
Chanchal Raj
@ZaidPathan, behoben!
Darkngs
22

Sie können einfach eine einfache Erweiterung durchführen wie:

import UIKit

// MARK: - Mixed string utils and helpers
extension String {


    /**
    Encode a String to Base64

    :returns: 
    */
    func toBase64()->String{

        let data = self.dataUsingEncoding(NSUTF8StringEncoding)

        return data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

    }

}

iOS 7 und höher

PiXeL16
quelle
20

Swift 4.0.3

import UIKit

extension String {

func fromBase64() -> String? {
    guard let data = Data(base64Encoded: self, options: Data.Base64DecodingOptions(rawValue: 0)) else {
        return nil
    }

    return String(data: data as Data, encoding: String.Encoding.utf8)
}

func toBase64() -> String? {
    guard let data = self.data(using: String.Encoding.utf8) else {
        return nil
    }

    return data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
    }
}
Miralem Cebic
quelle
Ich verwende denselben Code, aber der Complier gibt einen Fehler aus: Der Wert vom Typ 'Data' hat kein Mitglied 'base64EncodedStringWithOptions' in Swift 4.0.3
Ashwini Chougale
5
Mit Data(self.utf8).base64EncodedString()kein optional für toBase64 benötigt würden (). Von unten Antwort: stackoverflow.com/a/35360697/129202
Jonny
19

Swift 4.2

"abcd1234".data(using: .utf8)?.base64EncodedString()
Den
quelle
13

Nach gründlicher Recherche habe ich die Lösung gefunden

Codierung

    let plainData = (plainString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    let base64String =plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
    println(base64String) // bXkgcGxhbmkgdGV4dA==

Dekodierung

    let decodedData = NSData(base64EncodedString: base64String, options:NSDataBase64DecodingOptions.fromRaw(0)!)
    let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding)    
    println(decodedString) // my plain data

Mehr dazu unter http://creativecoefficient.net/swift/encoding-and-decoding-base64/

Kamau Wairegi
quelle
12

Xcode 8.3.2 • Swift 3.1

extension String {
    var data:          Data  { return Data(utf8) }
    var base64Encoded: Data  { return data.base64EncodedData() }
    var base64Decoded: Data? { return Data(base64Encoded: self) }
}

extension Data {
    var string: String? { return String(data: self, encoding: .utf8) }
}

let original = "iOS Developer Tips encoded in Base64"

let utf8Data = original.data                             // 36 bytes
let base64EncodedString = utf8Data.base64EncodedString() //  aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0\n"
let base64EncodedData = utf8Data.base64EncodedData()     //  48 bytes"

print("base64EncodedData:", original.base64Encoded)      //  48 bytes
print("base64EncodedString:", original.base64Encoded.string ?? "") // "aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0"
print("base64DecodedData:", original.base64Encoded.string?.base64Decoded  ?? "") // 36 bytes
print("base64DecodedString:", original.base64Encoded.string?.base64Decoded?.string ?? "") // iOS Developer Tips encoded in Base64
Leo Dabus
quelle
11

Swift 3 oder 4

let base64Encoded = Data("original string".utf8).base64EncodedString()
Greg Brown
quelle
1
Beste Antwort auf der Seite, da sie aktualisiert wird, eine nicht optionale Antwort zurückgibt und eine so einfache Operation nicht in eine Erweiterung einschließt.
Jano
8

Swift 5.1 , Xcode 11 :

public extension String {

    /// Assuming the current string is base64 encoded, this property returns a String
    /// initialized by converting the current string into Unicode characters, encoded to
    /// utf8. If the current string is not base64 encoded, nil is returned instead.
    var base64Decoded: String? {
        guard let base64 = Data(base64Encoded: self) else { return nil }
        let utf8 = String(data: base64, encoding: .utf8)
        return utf8
    }

    /// Returns a base64 representation of the current string, or nil if the
    /// operation fails.
    var base64Encoded: String? {
        let utf8 = self.data(using: .utf8)
        let base64 = utf8?.base64EncodedString()
        return base64
    }

}
Konstantin
quelle
Das funktioniert super, ist wirklich prägnanter Code und hat immens geholfen.
Raddevus
7

Swift 3/4 / 5.1

Hier ist eine einfache StringErweiterung, mit der Optionen im Falle eines Fehlers beim Decodieren beibehalten werden können.

extension String {
    /// Encode a String to Base64
    func toBase64() -> String {
        return Data(self.utf8).base64EncodedString()
    }

    /// Decode a String from Base64. Returns nil if unsuccessful.
    func fromBase64() -> String? {
        guard let data = Data(base64Encoded: self) else { return nil }
        return String(data: data, encoding: .utf8)
    }
}

Beispiel:

let testString = "A test string."

let encoded = testString.toBase64() // "QSB0ZXN0IHN0cmluZy4="

guard let decoded = encoded.fromBase64() // "A test string."
    else { return } 
stef
quelle
2

Nach allem Kampf hat mir das gefallen.

func conversion(str:NSString)
{

    if let decodedData = NSData(base64EncodedString: str as String, options:NSDataBase64DecodingOptions(rawValue: 0)),
        let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) {

        print(decodedString)//Here we are getting decoded string

Nachdem ich eine andere Funktion zum Konvertieren einer dekodierten Zeichenfolge in ein Wörterbuch aufgerufen habe

        self .convertStringToDictionary(decodedString as String)
    }


}//function close

// für String zum Wörterbuch

func convertStringToDictionary(text: String) -> [String:AnyObject]? {
    if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject]

            print(json)
            if let stack = json!["cid"]  //getting key value here
            {
                customerID = stack as! String
                print(customerID)
            }

        } catch let error as NSError {
            print(error)
        }
    }
    return nil
}
Narasimha Nallamsetty
quelle
2

FÜR SWIFT 3.0

let str = "iOS Developer Tips encoded in Base64"
print("Original: \(str)")

let utf8str = str.data(using: String.Encoding.utf8)

if let base64Encoded = utf8str?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
{

  print("Encoded:  \(base64Encoded)")

  if let base64Decoded = NSData(base64Encoded: base64Encoded, options:   NSData.Base64DecodingOptions(rawValue: 0))
    .map({ NSString(data: $0 as Data, encoding: String.Encoding.utf8.rawValue) })
  {
    // Convert back to a string
    print("Decoded:  \(base64Decoded)!")
  }
}
Anil Shukla
quelle
Es gibt mir immer nichts zurück. Können Sie bitte helfen.
Pawan
1

Swift 4.2

var base64String = "my fancy string".data(using: .utf8, allowLossyConversion: false)?.base64EncodedString()

Informationen zum Dekodieren finden Sie unter (unter https://gist.github.com/stinger/a8a0381a57b4ac530dd029458273f31a ).

//: # Swift 3: Base64 encoding and decoding
import Foundation

extension String {
//: ### Base64 encoding a string
    func base64Encoded() -> String? {
        if let data = self.data(using: .utf8) {
            return data.base64EncodedString()
        }
        return nil
    }

//: ### Base64 decoding a string
    func base64Decoded() -> String? {
        if let data = Data(base64Encoded: self) {
            return String(data: data, encoding: .utf8)
        }
        return nil
    }
}
var str = "Hello, playground"
print("Original string: \"\(str)\"")

if let base64Str = str.base64Encoded() {
    print("Base64 encoded string: \"\(base64Str)\"")
    if let trs = base64Str.base64Decoded() {
        print("Base64 decoded string: \"\(trs)\"")
        print("Check if base64 decoded string equals the original string: \(str == trs)")
    }
}
spnkr
quelle
0

SwiftyBase64 (vollständige Offenlegung: Ich habe es geschrieben) ist eine native Swift Base64-Codierung (keine Decodierungsbibliothek. Mit ihr können Sie Standard Base64 codieren:

let bytesToEncode : [UInt8] = [1,2,3]
let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode)

oder URL und Dateiname Safe Base64:

let bytesToEncode : [UInt8] = [1,2,3]
let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode, alphabet:.URLAndFilenameSafe)
Doug Richardson
quelle
0

@ Airspeed Velocity Antwort in Swift 2.0:

let str = "iOS Developer Tips encoded in Base64"
print("Original: \(str)")
let base64Encoded = str.dataUsingEncoding(NSUTF8StringEncoding)!.base64EncodedStringWithOptions([])
print("Encoded: \(base64Encoded)")
let base64DecodedData = NSData(base64EncodedString: base64Encoded, options: [])!
var base64DecodedString = String(data: base64DecodedData, encoding: NSUTF8StringEncoding)!
print("Decoded: \(base64DecodedString)")
Avi Cohen
quelle