ฉันจะเข้ารหัสสตริงเป็น Base64 ใน Swift ได้อย่างไร


115

ฉันต้องการแปลงสตริงเป็น Base64 ฉันพบคำตอบในหลายที่ แต่มันใช้ไม่ได้อีกต่อไปใน Swift ฉันใช้ Xcode 6.2 ฉันเชื่อว่าคำตอบอาจใช้ได้กับ Xcode เวอร์ชันก่อนหน้าไม่ใช่ Xcode 6.2

ใครช่วยแนะนำฉันให้ทำใน Xcode 6.2 ได้ไหม

คำตอบที่ฉันพบคือสิ่งนี้ แต่ใช้ไม่ได้ใน Xcode เวอร์ชันของฉัน:

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

อ้างอิง: http://iosdevelopertips.com/swift-code/base64-encode-decode-swift.html


ส่วนขยายของ Swift นั้นสะอาดและสะดวก stackoverflow.com/a/46969102/1996294
Ashok

คำตอบ:


69

ฉันไม่ได้ติดตั้ง 6.2 แต่ฉันไม่คิดว่า 6.3 มีความแตกต่างในเรื่องนี้:

dataUsingEncoding ส่งคืนตัวเลือกดังนั้นคุณต้องแกะออก

NSDataBase64EncodingOptions.fromRaw ถูกแทนที่ด้วย NSDataBase64EncodingOptions(rawValue:)ได้ถูกแทนที่ด้วยน่าแปลกใจเล็กน้อยนี่ไม่ใช่โปรแกรมเริ่มต้นที่ล้มเหลวดังนั้นคุณไม่จำเป็นต้องแกะมันออก

แต่เนื่องจากNSData(base64EncodedString:) เป็นโปรแกรมเริ่มต้นที่ล้มเหลวคุณจึงต้องแกะมันออก

Btw การเปลี่ยนแปลงทั้งหมดนี้แนะนำโดย Xcode migrator (คลิกข้อความแสดงข้อผิดพลาดในรางน้ำและมีคำแนะนำ "แก้ไขปัญหา")

โค้ดสุดท้ายเขียนใหม่เพื่อหลีกเลี่ยงการบีบอัดมีลักษณะดังนี้:

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

(หากใช้ Swift 1.2 คุณสามารถใช้ if-allow หลายรายการแทนแผนที่ได้)

อัปเดต 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
ทำ[]แทนNSDataBase64EncodingOptions(rawValue: 0)ไม่ได้เหรอ
brimstone

ใช่คุณสามารถ; ฉันเพิ่งทดสอบมัน []เป็นค่าเริ่มต้นดังนั้นคุณสามารถเรียกใช้ฟังก์ชันได้โดยไม่ต้องส่งผ่านพารามิเตอร์ใด ๆ :utf8str?.base64EncodedString()
Peter Schorn

200

รวดเร็ว

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

}

นี่เป็นรหัสที่ปลอดภัยคุณต้องจัดการตัวเลือก
Mohammad Zaid Pathan

เพิ่ม Swift 3 Syntax
Matthew Knippen

3
ฉันพยายามแปลงสตริง 64 ฐานนี้: dfYcSGpvBqyzvkAXkdbHDA==และผลลัพธ์ที่คาดหวังจะต้องเป็น: u�Hjo���@���แต่ฟังก์ชันด้านบนจะคืนค่าเป็นศูนย์ คุณสามารถตรวจสอบเอาต์พุตของสตริงฐาน 64 ด้านบนได้ในไซต์เหล่านี้: Site1 , Site2
Chanchal Raj

@ZaidPathan แก้ไขแล้ว!
Darkngs

23

คุณสามารถทำส่วนขยายง่ายๆเช่น:

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 ขึ้นไป


20

สวิฟต์ 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))
    }
}

ฉันใช้รหัสเดียวกัน แต่ยังคงมีข้อผิดพลาด: ค่าของประเภท 'Data' ไม่มีสมาชิก 'base64EncodedStringWithOptions' ใน Swift 4.0.3
Ashwini Chougale

5
โดยData(self.utf8).base64EncodedString()ไม่จำเป็นต้องใช้ตัวเลือกใด ๆ สำหรับ toBase64 () จากคำตอบด้านล่าง: stackoverflow.com/a/35360697/129202
จอนนี่


13

หลังจากการวิจัยอย่างละเอียดฉันพบวิธีแก้ปัญหา

การเข้ารหัส

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

ถอดรหัส

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

เพิ่มเติมเกี่ยวกับhttp://creativecoefficient.net/swift/encoding-and-decoding-base64/


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 หรือ 4

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

1
คำตอบที่ดีที่สุดในหน้านี้เนื่องจากมีการอัปเดตจะส่งคืนค่าที่ไม่ใช่ทางเลือกและไม่รวมการดำเนินการง่ายๆดังกล่าวไว้ในส่วนขยาย
Jano

8

สวิฟต์ 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
    }

}

สิ่งนี้ใช้งานได้ดีเป็นรหัสที่รวบรัดและช่วยได้มาก
raddevus

7

Swift 3/4 / 5.1

นี่คือStringส่วนขยายที่เรียบง่ายซึ่งช่วยให้สามารถเก็บรักษาตัวเลือกในกรณีที่เกิดข้อผิดพลาดขณะถอดรหัส

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

ตัวอย่าง:

let testString = "A test string."

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

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

2

หลังจากการต่อสู้ทั้งหมดฉันก็ทำแบบนี้

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

หลังจากที่ฉันเรียกใช้ฟังก์ชันอื่นสำหรับการแปลงสตริงที่ถอดรหัสเป็นพจนานุกรม

        self .convertStringToDictionary(decodedString as String)
    }


}//function close

// สำหรับสตริงในพจนานุกรม

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

สำหรับ 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)!")
  }
}

มันจะคืนค่าศูนย์ให้ฉันเสมอ คุณสามารถช่วย.
Pawan

1

Swift 4.2

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

ในการถอดรหัสโปรดดู (จาก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 (การเปิดเผยแบบเต็ม: ฉันเขียนไว้แล้ว) เป็นการเข้ารหัส Swift Base64 แบบดั้งเดิม (ไม่มีไลบรารีถอดรหัสด้วยคุณสามารถเข้ารหัส Base64 มาตรฐาน:

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

หรือ URL และชื่อไฟล์ Safe Base64:

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

0

คำตอบ @Airspeed Velocity ใน 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)")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.