Làm cách nào để mã hóa một chuỗi thành Base64 trong Swift?


115

Tôi muốn chuyển đổi một chuỗi thành Base64. Tôi đã tìm thấy câu trả lời ở một số nơi, nhưng nó không hoạt động nữa trong Swift. Tôi đang sử dụng Xcode 6.2. Tôi tin rằng câu trả lời có thể hoạt động trong các phiên bản Xcode trước đó chứ không phải Xcode 6.2.

Ai đó có thể vui lòng hướng dẫn tôi làm điều này trong Xcode 6.2 không?

Câu trả lời mà tôi tìm thấy là cái này, nhưng nó không hoạt động trong phiên bản Xcode của tôi:

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


Tiện ích mở rộng Swift rất sạch sẽ và tiện dụng. stackoverflow.com/a/46969102/1996294
Ashok

Câu trả lời:


69

Tôi chưa cài đặt 6.2 nhưng tôi không nghĩ 6.3 có gì khác biệt về mặt này:

dataUsingEncoding trả về một tùy chọn, vì vậy bạn cần phải mở gói đó.

NSDataBase64EncodingOptions.fromRawđã được thay thế bằng NSDataBase64EncodingOptions(rawValue:). Hơi ngạc nhiên, đây không phải là bộ khởi tạo khả dụng nên bạn không cần phải mở nó ra.

Nhưng vì NSData(base64EncodedString:) một trình khởi tạo có sẵn, bạn cần phải mở nó ra.

Btw, tất cả những thay đổi này được đề xuất bởi Xcode migrator (nhấp vào thông báo lỗi trong máng xối và nó có gợi ý "fix-it").

Mã cuối cùng, được viết lại để tránh buộc mở, trông như thế này:

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

(nếu sử dụng Swift 1.2, bạn có thể sử dụng nhiều if-cho phép thay vì bản đồ)

Cập nhật 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
Bạn không thể làm []thay vì NSDataBase64EncodingOptions(rawValue: 0)?
diêm sinh

198

Nhanh

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

}

Đây là mã bảo mật, bạn cần xử lý các tùy chọn.
Mohammad Zaid Pathan

Đã thêm cú pháp Swift 3
Matthew Knippen.

3
Tôi đã thử chuyển đổi chuỗi cơ sở 64 này: dfYcSGpvBqyzvkAXkdbHDA==và đầu ra dự kiến ​​phải là: u�Hjo���@���nhưng hàm trên trả về nil. Bạn có thể kiểm tra đầu ra của chuỗi base-64 ở trên trên các trang web này: Site1 , Site2
Chanchal Raj

@ZaidPathan, đã sửa!
Darkngs

22

Bạn chỉ có thể thực hiện một tiện ích mở rộng đơn giản như:

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 trở lên


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

Tôi đang sử dụng cùng một mã nhưng vẫn còn, biên dịch cho lỗi: Giá trị của loại 'dữ liệu' không có thành viên 'base64EncodedStringWithOptions' trong Swift 4.0.3
Ashwini Chougale

5
Không Data(self.utf8).base64EncodedString()cần tùy chọn nào cho toBase64 (). Từ câu trả lời bên dưới: stackoverflow.com/a/35360697/129202
Jonny

19

Swift 4.2

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

13

Sau khi nghiên cứu kỹ lưỡng, tôi đã tìm ra giải pháp

Mã hóa

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

Giải mã

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

Thêm thông tin về http://creativecoeosystem.net/swift/encoding-and-decoding-base64/ này


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 hoặc 4

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

1
Câu trả lời hay nhất trên trang vì nó được cập nhật, trả về không phải là tùy chọn và không gói thao tác đơn giản như vậy trong một tiện ích mở rộng.
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
    }

}

Điều này hoạt động tuyệt vời, thực sự là mã ngắn gọn và giúp ích rất nhiều.
raddevus

7

Swift 3/4 / 5.1

Đây là một Stringtiện ích mở rộng đơn giản , cho phép bảo toàn các tùy chọn trong trường hợp có lỗi khi giải mã.

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

Thí dụ:

let testString = "A test string."

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

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

2

Sau tất cả đấu tranh, tôi đã làm như thế này.

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

Sau khi tôi gọi một hàm khác để chuyển đổi chuỗi đã giải mã thành từ điển

        self .convertStringToDictionary(decodedString as String)
    }


}//function close

// cho chuỗi vào từ điển

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

ĐỐI VỚI 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)!")
  }
}

Nó luôn trả lại cho tôi con số không. Bạn có thể vui lòng giúp đỡ.
Pawan

1

Swift 4.2

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

để giải mã, hãy xem (từ 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 (tiết lộ đầy đủ: Tôi đã viết nó) là một mã hóa Swift Base64 gốc (không có thư viện giải mã. Với nó, bạn có thể mã hóa Base64 tiêu chuẩn:

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

hoặc URL và tên tệp an toàn Base64:

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

0

Câu trả lời @Airspeed Velocity trong 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)")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.