Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] Base64 String 사용 방법 본문

iOS 응용 (swift)

[iOS - Swift] Base64 String 사용 방법

jake-kim 2022. 9. 9. 23:33

Base64란?

  • Base64는 64진법으로 (=8비트) 이루어진 데이터
  • ASCII 영역의 문자들로만 이루어진 문자열로 바꾸는 인코딩 방식
    * 인코딩: 파일에 저장된 형태, 형식을 데이터 표준화 및 처리 속도 향상을 위해 다른 형태로 변환하는 처리
  • Base64인코딩은 24bit의 buffer를 생성하여 바이트 데이터를 넣은 뒤, 6bit 단위로 잘라 ASCII 문자로 변환

Base64 특징

  • 장점
    • 통신과정에서 바이너리 데이터의 손실을 막기 위함
    • (base64없이 ASCII인코딩만 사용할때, ASCII는 7 bit eonciding이지만 1bit를 처리하는 방식이 시스템별로 상이하기 때문에 데이터의 손실할 수 있는 가능성이 존재)
    • 일부 제어 문자 (\n와 같은 문자)의 경우 시스템 별로 다른 코드값을 가지고 있는 점이 존재
      base64는 ASCII중 제어 문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용
  • 단점
    • Base64 인코딩 시 6bit당 2bit의 Obserhead가 발생하여 데이터 크기의 약 33%정도 증가

Swift에서 Base64 사용 방법

  • Data()를 base64String으로 변경하기
    • swift내부에서 제공
@inlinable public func base64EncodedString(options: Data.Base64EncodingOptions = []) -> String

그대로 사용)

// Data -> base64 String
let data = Data()
let base64String = data.base64EncodedString()
  • String -> Base64Data
    • extension String으로 따로 정의하여 사용
    • swift 내부에서 지원하는 Data 메소드인 base64EncodedData() 사용
    • String -> utf8 데이터로 변경 -> base64EncodedData()로 변경
extension String {
  var base64Data: Data? {
    let utf8Data = self.data(using: .utf8)
    return utf8Data?.base64EncodedData()
  }
}

// String -> base64 Data
let someString = "someString"
let base64Data = someString.base64Data
print(base64Data) // Optional(16 bytes)
  • String -> base64String
    • extension String으로 따로 정의하여 사용
    • swift 내부에서 지원하는 Data 메소드인 base64EncodedString() 사용
extension String {
  var asBase64: String? {
    let utf8Data = self.data(using: .utf8)
    return utf8Data?.base64EncodedString()
  }
}

// String -> base64String
let someString = "someString"
let base64String2 = someString.asBase64
print(base64String2?.asBase64) // Optional("c29tZVN0cmluZw==")
  • base64, data 비교
// String -> base64 Data
let someString = "someString"
let base64Data = someString.base64Data

// String -> base64String
let base64String2 = someString.asBase64

print(base64Data?.base64EncodedString() == base64String2?.asBase64) // true

주의) 중간에 utf로 변경하지 않으면, String를 data로 변경될할때 nil이 되므로 주의할것

 * 잘못된 코드

// String이 base64형태가 아니므로 Data로 변경할때 nil이 됨 (utf로 먼저 변경 필요)
extension String {
  var base64Data: Data? {
    Data(base64Encoded: self)
  }
  var base64String: String? {
    self.base64Data?.base64String
  }
}

* 전체 코드: https://github.com/JK0369/ExBase64String


* 참고

https://devuna.tistory.com/41

https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464

Comments