如何在 Swift 中将字符串编码为 Base64?

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

189581 次浏览

我没有安装6.2,但我不认为6.3在这方面有什么不同:

dataUsingEncoding返回一个可选项,因此您需要打开它。

NSDataBase64EncodingOptions.fromRaw已被 NSDataBase64EncodingOptions(rawValue:)取代。有点令人惊讶的是,这不是一个可失败的初始化程序,所以您不需要打开它。

但是因为 NSData(base64EncodedString:) 是一个可失败的初始化器,所以需要打开它。

顺便说一下,所有这些改变都是由 Xcode 迁移器建议的(点击错误消息,它有一个“修复它”的建议)。

最后的代码,重写以避免力量打开,看起来像这样:

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-let 代替 map)

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

SwiftyBase64 (完全公开: 这是我编写的)是一个本地 Swift Base64编码(没有解码库)。使用它,您可以编码标准的 Base64:

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

或 URL 和文件名安全基础64:

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

你可以做一个简单的扩展,比如:

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


}


}

IOS7及以上版本

经过彻底的研究,我找到了解决办法

编码中

    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/的信息

斯威夫特

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


}

经历了这么多的挣扎,我还是喜欢这样。

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
}

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

斯威夫特三号或者四号

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

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 }

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

Xcode 11.4• Swift 5.2或更高版本

extension StringProtocol {
var data: Data { Data(utf8) }
var base64Encoded: Data { data.base64EncodedData() }
var base64Decoded: Data? { Data(base64Encoded: string) }
}

extension LosslessStringConvertible {
var string: String { .init(self) }
}

extension Sequence where Element == UInt8 {
var data: Data { .init(self) }
var base64Decoded: Data? { Data(base64Encoded: data) }
var string: String? { String(bytes: 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.base64Decoded?.string ?? "") // iOS Developer Tips encoded in Base64

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

Swift 4.2

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

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

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
}


}
public extension String{
///base64EncodedString
var base64EncodedString:String{
if let data = data(using: .utf8){
return data.base64EncodedString()
}
return ""
}
}