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