Bagaimana cara saya menyandikan string ke Base64 di Swift?


115

Saya ingin mengonversi string ke Base64. Saya menemukan jawaban di beberapa tempat, tetapi tidak berfungsi lagi di Swift. Saya menggunakan Xcode 6.2. Saya yakin jawabannya mungkin berfungsi di versi Xcode sebelumnya dan bukan Xcode 6.2.

Bisakah seseorang memandu saya untuk melakukan ini di Xcode 6.2?

Jawaban yang saya temukan adalah ini, tetapi tidak berfungsi di versi Xcode saya:

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


Ekstensi Swift bersih dan praktis. stackoverflow.com/a/46969102/1996294
Ashok

Jawaban:


69

Saya tidak menginstal 6.2 tetapi menurut saya 6.3 tidak ada perbedaan dalam hal ini:

dataUsingEncoding mengembalikan opsional, jadi Anda perlu membukanya.

NSDataBase64EncodingOptions.fromRawtelah diganti dengan NSDataBase64EncodingOptions(rawValue:). Sedikit mengherankan, ini bukanlah penginisialisasi yang dapat gagal sehingga Anda tidak perlu membukanya.

Tetapi karena NSData(base64EncodedString:) merupakan penginisialisasi yang gagal, Anda perlu membukanya.

Btw, semua perubahan ini disarankan oleh migrator Xcode (klik pesan kesalahan di selokan dan ada saran "perbaiki").

Kode terakhir, ditulis ulang untuk menghindari force-unwraps, terlihat seperti ini:

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)")
    }
}

(jika menggunakan Swift 1.2 Anda bisa menggunakan beberapa if-lets alih-alih peta)

Pembaruan Swift 5:

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 ?? "")")
    }
}

3
Tidak bisa Anda hanya melakukan []bukan NSDataBase64EncodingOptions(rawValue: 0)?
belerang

198

Cepat

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()
    }

}

Ini ada dalam kode aman, Anda perlu menangani pilihan.
Mohammad Zaid Pathan

Menambahkan Sintaks Swift 3
Matthew Knippen

3
Saya mencoba mengubah string basis 64 ini: dfYcSGpvBqyzvkAXkdbHDA==dan keluaran yang diharapkan harus: u�Hjo���@���tetapi fungsi di atas mengembalikan nihil. Anda dapat memeriksa keluaran string base-64 di atas di situs-situs ini: Site1 , Site2
Chanchal Raj

@ZaidPathan, diperbaiki!
Darkngs

22

Anda bisa melakukan ekstensi sederhana seperti:

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 dan yang lebih baru


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))
    }
}

Saya menggunakan kode yang sama tetapi tetap saja, komplier memberikan kesalahan: Nilai tipe 'Data' tidak memiliki anggota 'base64EncodedStringWithOptions' di Swift 4.0.3
Ashwini Chougale

5
Tanpa Data(self.utf8).base64EncodedString()opsional akan diperlukan untuk toBase64 (). Dari jawaban di bawah ini: stackoverflow.com/a/35360697/129202
Jonny

19

Swift 4.2.0

"abcd1234".data(using: .utf8)?.base64EncodedString()

13

Setelah penelitian menyeluruh saya menemukan solusinya

Pengkodean

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

Decoding

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

Selengkapnya tentang http://creativecoefficient.net/swift/encoding-and-decoding-base64/ ini


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

11

Swift 3 atau 4

let base64Encoded = Data("original string".utf8).base64EncodedString()

1
Jawaban terbaik di halaman karena diperbarui, mengembalikan non opsional, dan tidak menggabungkan operasi sederhana seperti itu dalam ekstensi.
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
    }

}

Ini berfungsi dengan baik, merupakan kode yang sangat ringkas dan sangat membantu.
raddevus

7

Cepat 3/4 / 5.1

Berikut adalah Stringekstensi sederhana , memungkinkan untuk mempertahankan pilihan jika terjadi kesalahan saat mendekode.

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)
    }
}

Contoh:

let testString = "A test string."

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

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

2

Setelah semua perjuangan saya lakukan seperti ini.

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

Setelah saya memanggil fungsi lain untuk mengubah string yang didekodekan ke kamus

        self .convertStringToDictionary(decodedString as String)
    }


}//function close

// untuk string ke kamus

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
}

2

UNTUK 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)!")
  }
}

Itu selalu mengembalikan saya nol. Bisakah Anda membantu.
Pawan

1

Swift 4.2.0

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

untuk memecahkan kode, lihat (dari 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)")
    }
}

0

SwiftyBase64 (pengungkapan penuh: Saya yang menulisnya) adalah pengkodean Swift Base64 asli (tanpa pustaka decoding. Dengannya , Anda dapat mengenkode Base64 standar:

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

atau URL dan Nama File Safe Base64:

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

0

Jawaban @Airspeed Velocity di 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)")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.