Swift에서 문자열을 Base64로 인코딩하려면 어떻게해야합니까?


115

문자열을 Base64로 변환하고 싶습니다. 여러 곳에서 답을 찾았지만 Swift에서는 더 이상 작동하지 않습니다. Xcode 6.2를 사용하고 있습니다. 대답은 Xcode 6.2가 아닌 이전 Xcode 버전에서 작동 할 수 있다고 생각합니다.

누군가가 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


Swift 확장은 깨끗하고 편리합니다. stackoverflow.com/a/46969102/1996294
Ashok

답변:


69

6.2가 설치되어 있지 않지만 6.3이 이와 관련하여 다르지 않다고 생각합니다.

dataUsingEncoding 선택 사항을 반환하므로이를 풀어야합니다.

NSDataBase64EncodingOptions.fromRaw로 대체되었습니다 NSDataBase64EncodingOptions(rawValue:). 약간 놀랍게도 이것은 실패 할 수있는 이니셜 라이저가 아니므로 언 래핑 할 필요가 없습니다.

그러나 실패 할 수있는 이니셜 라이저 NSData(base64EncodedString:) 이므로 이를 풀어야합니다.

Btw, 이러한 모든 변경 사항은 Xcode migrator에 의해 제안되었습니다 (여백의 오류 메시지를 클릭하면 "수정"제안이 있음).

강제 풀림을 방지하기 위해 다시 작성된 최종 코드는 다음과 같습니다.

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을 사용할 수 있습니다)

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

3
[]대신 할 수 없습니까 NSDataBase64EncodingOptions(rawValue: 0)?
brimstone

198

빠른

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

}

이것은 보안 코드에 있으므로 선택 사항을 처리해야합니다.
Mohammad Zaid Pathan

추가 스위프트 3 구문
마태 복음 Knippen

3
이 기본 64 문자열을 변환하려고 시도했습니다. dfYcSGpvBqyzvkAXkdbHDA==예상 출력은 다음 과 u�Hjo���@���같아야합니다. 그러나 위의 함수는 nil을 반환합니다. 다음 사이트에서 위의 base-64 문자열 출력을 확인할 수 있습니다. Site1 , Site2
Chanchal Raj

@ZaidPathan, 고정!
Darkngs

22

다음과 같은 간단한 확장을 수행 할 수 있습니다.

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

동일한 코드를 사용하고 있지만 여전히 컴파일러에서 오류가 발생합니다. 'Data'유형의 값에는 Swift 4.0.3에서 'base64EncodedStringWithOptions'멤버가 없습니다
Ashwini Chougale

5
으로 Data(self.utf8).base64EncodedString()어떤 옵션이 toBase64 필요하지 될 것이다 (). 답은 아래에서 : stackoverflow.com/a/35360697/129202
조니

19

스위프트 4.2

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

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://creativecoefficient.net/swift/encoding-and-decoding-base64/ 에 대한 자세한 내용


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 또는 4

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

1
페이지가 업데이트되고 선택 사항이 아닌 항목을 반환하며 확장 프로그램에서 이러한 간단한 작업을 래핑하지 않기 때문에 페이지에 대한 최상의 답변입니다.
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
    }

}

이것은 훌륭하게 작동하고 정말 간결한 코드이며 엄청난 도움이되었습니다.
raddevus

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

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

그것은 항상 나를 반환하지 않습니다. 도와 주 시겠어요?
Pawan

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 (전체 공개 : 내가 작성)는 기본 Swift Base64 인코딩 (디코딩 라이브러리 없음)입니다.이를 사용하여 표준 Base64를 인코딩 할 수 있습니다.

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

또는 URL 및 파일 이름 Safe Base64 :

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

0

Swift 2.0의 @Airspeed Velocity 답변 :

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)")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.