2015-03-31 70 views
65

爲Base64我想一個字符串轉換爲一個base64。我在幾個地方找到了同樣的答案,但它不能迅速工作。我正在使用Xcode 6.2。我相信答案可能是以前的Xcode而不是Xcode 6.2。如何編碼字符串中迅速

可能有人請引導我做這在Xcode 6.2?

我找到了答案是這樣的。但它並沒有在Xcode 6.2工作

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

+0

斯威夫特擴展是清潔和便利。 https://stackoverflow.com/a/46969102/1996294 – 2017-11-03 08:59:01

回答

43

我沒有安裝6.2,但我不認爲6.3是在這方面有什麼不同:

dataUsingEncoding返回可選,所以你需要解開這個。

NSDataBase64EncodingOptions.fromRaw已被替換NSDataBase64EncodingOptions(rawValue:)。略微出人意料的是,這不是一個failable初始化,所以你並不需要解開它。

但由於NSData(base64EncodedString:) failable初始值設定項,您需要解開這個。

順便說一句,所有的這些變化是由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)") 
    } 
} 

(如果使用雨燕1.2,您可以使用多個if-允許的,而不是在地圖)

+3

你不能''''而不是'NSDataBase64EncodingOptions(rawValue:0)'? – brimstone 2016-07-17 05:05:31

0

SwiftyBase64(全面披露:我寫的)是土生土長的斯威夫特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) 
17

你可以只是做一個簡單的擴展,如:

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及以上

11

深入的研究後,我找到了解決辦法

編碼

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/

105

夫特3

import UIKit 

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

夫特2。3

import UIKit 

extension String { 

    func fromBase64() -> String? { 
     guard let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) else { 
      return nil 
     } 

     return String(data: data, encoding: NSUTF8StringEncoding) 
    } 

    func toBase64() -> String? { 
     guard let data = self.dataUsingEncoding(NSUTF8StringEncoding) else { 
      return nil 
     } 

     return data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
    } 
} 
+0

這是安全的代碼,你需要處理optionals。 – 2016-09-10 18:48:06

+0

添加Swift 3語法 – 2016-09-18 20:11:50

+0

我試着轉換這個base 64字符串:'dfYcSGpvBqyzvkAXkdbHDA =='並且期望的輸出必須是:'u Hjo @ ',但是上面的函數返回nil。您可以在這些網站上查看上述base-64字符串的輸出:[Site1](http://www.freeformatter.com/base64-encoder.html),[Site2](http://www.utilities-online.info /base64/#.WG6glbFh2Rs) – 2017-01-05 19:39:18

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

@Airspeed速度答案雨燕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

In斯威夫特3,你可以這樣做:

let base64Encoded = Data(str.utf8).base64EncodedString() 
4

斯威夫特3

下面是一個簡單String擴展更新的斯威夫特3,允許解碼時發生錯誤的情況下,保持自選。

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

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

的Xcode 8.3.2•夫特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 
3

斯威夫特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)) 
    } 
} 
+0

我使用相同的代碼,但仍然,編譯器給出錯誤:類型'數據'的值在Swift 4.0.3中沒有成員'base64EncodedStringWithOptions' – 2018-02-08 05:04:50