मैं स्विफ्ट में Base64 को एक स्ट्रिंग कैसे एन्कोड कर सकता हूं?


115

मैं एक स्ट्रिंग को Base64 में बदलना चाहता हूं। मुझे कई स्थानों पर उत्तर मिले, लेकिन यह स्विफ्ट में अब काम नहीं करता है। मैं 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


स्विफ्ट एक्सटेंशन स्वच्छ और आसान है। stackoverflow.com/a/46969102/1996294
अशोक

जवाबों:


69

मेरे पास 6.2 स्थापित नहीं है, लेकिन मुझे नहीं लगता कि 6.3 इस संबंध में कोई भिन्न है:

dataUsingEncoding एक वैकल्पिक देता है, इसलिए आपको इसे खोलना होगा।

NSDataBase64EncodingOptions.fromRawके साथ बदल दिया गया है NSDataBase64EncodingOptions(rawValue:)। थोड़ा आश्चर्य की बात है, यह एक फालतू इनिशियलाइज़र नहीं है इसलिए आपको इसे अनचेक करने की आवश्यकता नहीं है।

लेकिन चूंकि NSData(base64EncodedString:) यह एक फालतू इनिशियलाइज़र है, इसलिए आपको इसे अनफ्रेंड करने की ज़रूरत है।

Btw, ये सभी परिवर्तन 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 का उपयोग करते हैं तो आप नक्शे के बजाय कई का उपयोग कर सकते हैं)

स्विफ्ट 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)?
गंधक

199

तीव्र

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

}

यह सुरक्षित कोड में है, आपको वैकल्पिक को संभालने की आवश्यकता है।
मोहम्मद ज़ैद पठान

जोड़ा गया स्विफ्ट 3 सिंटेक्स
मैथ्यू निप्पन

3
मैंने इस आधार को 64 स्ट्रिंग में परिवर्तित करने की कोशिश की: dfYcSGpvBqyzvkAXkdbHDA==और अपेक्षित आउटपुट होना था: u�Hjo���@���लेकिन रिटर्न निल के ऊपर फ़ंक्शन। आप इन साइटों पर उपरोक्त बेस -64 स्ट्रिंग के आउटपुट की जांच कर सकते हैं: साइट 1 , साइट 2
चंचल राज

@ZaidPathan, तय!
डार्कजंस

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

मैं समान कोड का उपयोग कर रहा हूं, लेकिन फिर भी, त्रुटि देता है: प्रकार का मान 'डेटा' में कोई सदस्य नहीं है 'स्विफ्ट 4.0.3' में आधार 'आधार64स्ट्रीमिंग स्ट्रिंगविथऑक्शन'
अश्विनी चौगले

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://creativecoeffic.net/swift/encoding-and-decoding-base64/


12

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

11

स्विफ्ट 3 या 4

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

1
पृष्ठ पर सर्वश्रेष्ठ उत्तर क्योंकि यह अपडेट किया गया है, एक गैर-वैकल्पिक रिटर्न देता है, और इस तरह के सरल ऑपरेशन को विस्तार में नहीं लपेटता है।
Jano

8

स्विफ्ट 5.1 , एक्सकोड 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
    }

}

यह बहुत अच्छा काम करता है, वास्तव में सक्सेस कोड है और बेहद मदद करता है।
मूलांक

7

स्विफ्ट 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

स्विफ्ट 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)!")
  }
}

यह हमेशा मुझे शून्य देता है। क्या आप मदद कर सकते हैं?
पवन

1

स्विफ्ट 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 (पूर्ण प्रकटीकरण: मैंने इसे लिखा) एक देशी स्विफ्ट बेस 64 एन्कोडिंग (कोई डिकोडिंग लाइब्रेरी नहीं है। इसके साथ, आप मानक बेस 64 को एन्कोड कर सकते हैं:

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)

0

स्विफ्ट 2.0 में @Aspspeed वेलोसिटी का जवाब:

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)")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.