Skip to content

Encoding

songwongeun edited this page Jan 28, 2019 · 3 revisions

인코딩이란?

코드화, 암호화를 의미하며 반대말은 디코딩이다. 데이터를 한 형태에서 다른 형태로 변환하는 프로세스

컴퓨터에서 인코딩은 동영상이나 문자 인코딩 외에도 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정을 통틀어 일컫는다.

사용하는 이유: 표준화, 보안, 처리 속도 향상, 저장공간 절약

표준화

ASCII encoding?

ASCII표와 일치하는 수와 문자를 일치

URL encoding?

ASCII코드에 없는 영어를 제외한 외국어(한국어 포함)와 특수문자를 표현하기 위해 사용 특징으로 코드 앞에 %가 붙는다.

Utf-8 encoding?

유니코드 인코딩 중 하나 문자열을 8-bit기반으로 저장, ANSI문자(ascii확장 8bit사용)는 그대로(1바이트) 아시아 문자는 3바이트로 가변 표기하는 인코딩 방식

Base64 encoding?

2진데이터(바이너리데이터)를 ASCII형태의 텍스트로 변환하는 인코딩 방법

Base64를 글자 그대로 직역하면 64진법이라는 뜻이다. 64진법은 컴퓨터한테 특별한데 그 이유는 64가 2의 제곱수 64=2^6이며 2의 제곱수에 기반한 진법 중 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법이기 때문이다. (ASCII에는 제어문자가 다수 포함되어 있기 때문에 화면에 표시되는 ASCII 문자는 128개가 되지 않는다.)

ASCII의 경우 7bits Encoding인데 나머지 1bit를 처리하는 방식이 시스템 별로 상이하다. 일부 제어문자의 경우 시스템 별로 다른 코드값을 갖는다. 따라서 ASCII는 시스템간 데이터를 전달하기에 안전하지 않다. Base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용한다.

단점: 전송해야될 데이터의 양이 늘어난다, 인코딩 디코딩에 추가 연산이 필요하다.

보안

HTML encoding?

ASCII코드 값을 기준으로하고 코드앞에 %#문자가 포함된다. XSS의 방어 대책으로 사용한다.

처리 속도 향상

Ex) 문자열을 인코딩해서 Integer형태로 바꿀 수 있다면 더 빠르게 비교연산 같은 것이 가능해 진다.

저장공간 절약

보통 미디어 파일에서 디스크의 용량을 절약하기 위해 인코딩을 사용한다. (ex. Jpeg)

swift에서는?

Codable : 자신을 변환하거나 외부표현으로(ex.JSON)으로 변환 할 수 있는 타입

JSONEncoder.swift

...
/// The strategy to use in encoding binary data. Defaults to `.base64`.
open var dataEncodingStrategy: DataEncodingStrategy = .base64
...

open func encode<T :Encodable>(_ value: T) throw -> Data {

    let encoder = __JSONEncoder(options: self.options)

    //box_ : value를 NSObject형태로 만든다.
    let topLevel = try encoder.box_(value)

    //JSONSerialization에서 실제 파싱하는 작업이 이루어진다.
    JSONSerialization.data(withJSONObject: topLevel, options: writingOptions)
}