Swift'de bir dizeyi Base64 olarak nasıl kodlayabilirim?


115

Bir dizeyi Base64'e dönüştürmek istiyorum. Cevapları birkaç yerde buldum ama artık Swift'de çalışmıyor. Xcode 6.2 kullanıyorum. Cevabın Xcode 6.2 değil, önceki Xcode sürümlerinde çalışabileceğine inanıyorum.

Birisi bunu Xcode 6.2'de yapmam için bana rehberlik edebilir mi?

Bulduğum cevap şuydu, ancak Xcode sürümümde çalışmıyor:

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 uzantısı temiz ve kullanışlıdır. stackoverflow.com/a/46969102/1996294
Ashok

Yanıtlar:


69

6.2 kurulu değil ama 6.3'ün bu konuda farklı olduğunu düşünmüyorum:

dataUsingEncoding isteğe bağlı bir döndürür, bu yüzden onu açmanız gerekir.

NSDataBase64EncodingOptions.fromRawile değiştirildi NSDataBase64EncodingOptions(rawValue:). Biraz şaşırtıcı bir şekilde, bu kullanılabilir bir başlatıcı değildir, bu yüzden onu açmanıza gerek yoktur.

Ancak NSData(base64EncodedString:) kullanılabilir bir başlatıcı olduğundan, onu açmanız gerekir.

Btw, tüm bu değişiklikler Xcode göçmeni tarafından önerildi (oluktaki hata mesajını tıklayın ve bir "düzelt-düzelt" önerisi var).

Zorla açmadan kaçınmak için yeniden yazılan son kod şuna benzer:

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 kullanıyorsanız harita yerine birden fazla if-let kullanabilirsiniz)

Swift 5 Güncellemesi:

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
[]Bunun yerine yapamaz mısın NSDataBase64EncodingOptions(rawValue: 0)?
brimstone

Evet yapabilirsin; Daha yeni test ettim. []varsayılan değerdir, bu nedenle herhangi bir parametreyi girmeden işlevi çağırabilirsiniz:utf8str?.base64EncodedString()
Peter Schorn

200

hızlı

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

}

Bu güvenli koddadır, opsiyonelleri işlemeniz gerekir.
Mohammad Zaid Pathan

Swift 3 Sözdizimi eklendi
Matthew Knippen

3
Bu temel 64 dizesini dönüştürmeyi denedim: dfYcSGpvBqyzvkAXkdbHDA==ve beklenen çıktı şu olmalıydı: u�Hjo���@���ancak yukarıdaki işlev nil döndürüyor. Yukarıdaki 64 taban dizisinin çıktısını şu sitelerden kontrol edebilirsiniz: Site1 , Site2
Chanchal Raj

@ZaidPathan, düzeltildi!
Darkngs

23

Şunun gibi basit bir uzantı yapabilirsiniz:

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 ve üstü


20

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

Aynı kodu kullanıyorum ama yine de, derleyici hata veriyor: Swift 4.0.3'te 'Veri' türünün değeri 'base64EncodedStringWithOptions' üyesi yok
Ashwini Chougale

5
İle Data(self.utf8).base64EncodedString()hiçbir opsiyonel toBase64 ihtiyaç duyulacağını (). Aşağıdaki cevaptan: stackoverflow.com/a/35360697/129202
Jonny

19

Swift 4.2

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

13

Kapsamlı bir araştırmadan sonra çözümü buldum

Kodlama

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

Decoding

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

Bu http://creativecoefficient.net/swift/encoding-and-decoding-base64/ hakkında daha fazla bilgi


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 veya 4

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

1
Sayfadaki en iyi yanıt, çünkü güncellendiği, isteğe bağlı olmayan bir döndürdüğü ve bu kadar basit bir işlemi bir uzantıya sarmadığı için.
Jano

8

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
    }

}

Bu harika çalışıyor, gerçekten kısa ve öz bir kod ve çok yardımcı oldu.
raddevus

7

Hızlı 3/4 / 5.1

Burada, Stringkod çözme sırasında bir hata durumunda opsiyonellerin korunmasına izin veren basit bir uzantı var.

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

Misal:

let testString = "A test string."

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

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

2

Tüm mücadeleden sonra bunu beğendim.

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

Kodu çözülmüş dizeyi sözlüğe dönüştürmek için başka bir işlevi çağırdıktan sonra

        self .convertStringToDictionary(decodedString as String)
    }


}//function close

// dizeden sözlüğe

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 İÇİN

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

Bana her zaman sıfır döndürür. Lütfen yardım edebilir misin.
Pawan

1

Swift 4.2

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

kodunu çözmek için bkz. ( https://gist.github.com/stinger/a8a0381a57b4ac530dd029458273f31a adresinden )

//: # 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 (tam açıklama: Ben yazdım) yerel bir Swift Base64 kodlamasıdır (kod çözme kitaplığı yoktur. Bununla birlikte, standart Base64'ü kodlayabilirsiniz:

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

veya URL ve Dosya Adı Safe Base64:

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

0

Swift 2.0'da @Airspeed Velocity yanıtı:

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)")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.