168 votos

¿Cómo puedo codificar/decodificar una cadena a Base64 en Swift?

Quiero convertir una cadena a Base64. Encontré respuestas en varios lugares, pero ya no funciona en Swift. Estoy usando Xcode 6.2. Creo que la respuesta podría funcionar en versiones anteriores de Xcode y no en Xcode 6.2.

¿Alguien podría por favor guiarme para hacer esto en Xcode 6.2?

La respuesta que encontré fue esta, pero no funciona en mi versión de Xcode:

var str = "iOS Developer Tips encoded in Base64"
println("Original: \(str)")

// UTF 8 str from original
// NSData! type returned (opcional)
let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding)

// Base64 encode UTF 8 string
// fromRaw(0) es equivalente a 'base64EncodedStringWithOptions:0' de objc
// Observa el unwrapping dado el opcional NSData!
// NSString! devuelto (opcional)
let base64Encoded = utf8str.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
println("Encoded:  \(base64Encoded)")

// Base64 Decode (volver al otro lado)
// Observa el unwrapping dado el opcional NSString!
// NSData devuelto
let data = NSData(base64EncodedString: base64Encoded, options: NSDataBase64DecodingOptions.fromRaw(0)!)

// Convertir de vuelta a una cadena
let base64Decoded = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Decoded:  \(base64Decoded)")

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

281voto

Darkngs Puntos 805

Swift

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

}

104voto

Airspeed Velocity Puntos 39766

No tengo instalado 6.2 pero creo que 6.3 no es diferente en este aspecto:

dataUsingEncoding devuelve un opcional, así que necesitas desempaquetarlo.

NSDataBase64EncodingOptions.fromRaw ha sido reemplazado con NSDataBase64EncodingOptions(rawValue:). Sorprendentemente, esto no es un inicializador que pueda fallar, así que no necesitas desempaquetarlo.

Pero ya que NSData(base64EncodedString:) es un inicializador que puede fallar, necesitas desempaquetarlo.

Por cierto, todos estos cambios fueron sugeridos por el migrador de Xcode (haz clic en el mensaje de error en el margen y tiene una sugerencia de "arreglarlo").

El código final, reescrito para evitar desempaquetamientos forzados, se ve así:

import Foundation

let str = "iOS Developer Tips codificados en Base64"
println("Original: \(str)")

let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding)

if let base64Encoded = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
{

    println("Codificado:  \(base64Encoded)")

    if let base64Decoded = NSData(base64EncodedString: base64Encoded, options:   NSDataBase64DecodingOptions(rawValue: 0))
                          .map({ NSString(data: $0, encoding: NSUTF8StringEncoding) })
    {
        // Convertir de nuevo a un string
        println("Decodificado:  \(base64Decoded)")
    }
}

(si estás utilizando Swift 1.2 podrías usar varios if-lets en lugar de map)

Actualización de Swift 5:

import Foundation

let str = "iOS Developer Tips codificados en Base64"
print("Original: \(str)")

let utf8str = str.data(using: .utf8)

if let base64Encoded = utf8str?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) {
    print("Codificado: \(base64Encoded)")

    if let base64Decoded = Data(base64Encoded: base64Encoded, options: Data.Base64DecodingOptions(rawValue: 0))
    .map({ String(data: $0, encoding: .utf8) }) {
        // Convertir de nuevo a un string
        print("Decodificado: \(base64Decoded ?? "")")
    }
}

31voto

Den Puntos 752

Swift 4.2

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

Swift 4.2

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

29voto

Leo Dabus Puntos 115565

Xcode 11.4 • Swift 5.2 o posterior

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 codificado en 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 codificado en Base64

23voto

PiXeL16 Puntos 798

Podrías simplemente hacer una simple extensión como:

import UIKit

// MARK: - Utilidades y ayudantes de cadena mixta
extension String {

    /**
    Codificar una cadena a Base64

    :returns: 
    */
    func toBase64()->String{

        let data = self.dataUsingEncoding(NSUTF8StringEncoding)

        return data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

    }

}

iOS 7 en adelante

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X