在Swift中,我该如何对字符串进行Base64编码/解码?

166
我想将一个字符串转换为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)")

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

Swift扩展非常干净和方便。https://dev59.com/PFwZ5IYBdhLWcg3wGs_D#46969102 - Ashok
17个回答

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
public extension String{
    ///base64EncodedString
    var base64EncodedString:String{
        if let data = data(using: .utf8){
            return data.base64EncodedString()
        }
        return ""
    }
}

3
请注意,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到解决类似问题的方法,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,“你能否编辑你的回答,包括你正在做什么的解释和为什么认为这是最佳方法?” - Jeremy Caney

2

将数据转换为字符串的简短示例:

import Foundation

let base64EncodedString = "SGVsbG8sIFdvcmxkIQ=="

if let data = Data(base64Encoded: base64EncodedString) {
  if let str = String(data: data, encoding: .utf8) {
    print(str)  // Output: "Hello, World!"
  }
}

这段代码首先使用 Data(base64Encoded:) 初始化器从 base64 编码的字符串创建一个 Data 对象。然后,它使用 String(data:encoding:) 初始化器从数据对象创建一个字符串。

请注意,Data(base64Encoded:)String(data:encoding:) 初始化器都可能抛出错误,因此最好将代码包装在 do-catch 块中以处理任何潜在的错误。


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

它总是返回 nil。你能帮忙吗? - 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

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

0

SwiftyBase64(完全透明:我写的)是原生的Swift Base64编码(无需解码库)。使用它,您可以对标准Base64进行编码:

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

或URL和文件名安全的Base64:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接