base64는 바이너리 데이터를 64개의 문자로 변환하는 인코딩입니다.

변환에 사용하는 64개의 문자는 다음과 같습니다.

코드 문자
0~25 ABCDEFGHIJKLMNOPQRSTUVWXYZ(알파벳 대문자)
26~51 abcdefghijklmnopqrstuvwxyz(알파벳 소문자)
52~61 0123456789(숫자)
62, 63 +, /

변환 과정을 요약하면 다음과 같습니다.

1. 비트를 6개씩 묶습니다.

    비트를 6개씩 묶는 이유는 base64 문자로 변환하기 위해서 인데, 0~63 수로 변환하기 위해서 6비트가 필요하기 때문입니다.

    6개씩 묶기 위해 총 비트수가 6의 배수여야 하기 때문에, 부족한 비트수는 0으로 채웁니다.

2. 각 6개의 비트를 이진수 코드로 해석해 base64에 해당하는 문자로 바꿉니다.

3. 변환된 결과에 패딩 문자(=)를 붙힙니다.

    base64 변환 결과의 길이는 4의 배수여야 하기 때문에, 부족한 문자를 =로 채웁니다.

    그래서 입력에 따라 결과의 마지막에 패딩 =이 최대 3개 등장합니다.

위 과정을 파이썬으로 구현한 코드는 다음과 같습니다.

base64 파이썬 구현

import string

# base64 문자, (알파벳 대문자) + (알파벳 대문자) + (숫자) + (+/)
base64Chars = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'

def toBase64(msg):
    # 바이너리로 인코딩
    msgb = msg.encode()
    # 2진수를 문자열로 표현
    bins = ''
    for b in msgb:
        bins += format(b, '08b')
    # 6의 배수로 맞추기 위해 0을 추가
    if len(bins) % 6:
        bins += '0' * (6 - len(bins) % 6)
    idx = 0
    ret = ''
    while idx < len(bins):
    	# 6비트를 코드로 변환해 해당하는 base64문자로 치환
        ret += base64Chars[int(bins[idx:idx+6], 2)]
        idx += 6
    # 치환 결과가 4의 배수가 되게하기 위해 패딩 문자 =을 추가
    if len(ret) % 4:
        ret += '=' * (4 - len(ret) % 4)
    return ret

def main():
    result = toBase64('Base64 Encoding Result')
    print(result) # QmFzZTY0IEVuY29kaW5nIFJlc3VsdA==

if __name__ == "__main__":
    main()

'기타' 카테고리의 다른 글

유니코드를 UTF-8로 인코딩 하기  (0) 2022.07.14

+ Recent posts