💻 컴퓨터 개론

Base64 인코딩

ji-hyun 2023. 4. 1. 11:04

유니코드의 등장 배경

아스키코드가 영문 알파벳을 사용하는 대표적인 문자 인코딩이라면, 유니코드는 전 세계의 모든 문자를 표현할 수 있는 산업 표준이다.

 

좀 더 자세히 차이점을 알아보자

1바이트로 구성되어 있는 아스키 코드8비트(==1바이트) 중 7개의 비트만 사용한다. 나머지 1비트는 Parity Bit이라고 불리는 오류 체크를 위한 비트로 사용한다.

 

 

예를 들어 아스키 코드 65 인 문자 "A" 는 이진법으로  1000001 로 나타낼 수 있다

알파벳을 포함, 영문 키보드로 입력할 수 있는 모든 기호들이 아스키 코드로 할당되어 있다. 매우 단순하고 간단하여 많은 곳에서 사용되었다.

 

하지만, 아스키 코드는 7개의 비트만을 사용하므로 총 2^7 = 128개의 부호밖에 나타낼 수없다. 이를 보완하기 위해 8비트로 확장한 ANSI 코드가 나오기도 했다. 따라서 이 ANSI 코드는 2^8=256개의 부호를 나타낼 수 있었지만, 그럼에도 전 세계의 모든 문자를 나타내기에는 역부족이었다.

 

 

 

 

 

💡 이러한 문제를 해결할 수 있는 방법이 바로 유니코드이다.

 

유니코드는 전 세계의 문자를 일관되게 표현하는 업계 표준이며 1바이트로 구성되어 있는 아스키코드와 달리 2바이트, 즉 16비트로 문자를 표현할 수 있다. 따라서 2^16=65536 개의 문자를 표현할 수 있다.

2진법으로는 0000 0000 0000 0000 ~ 1111 1111 1111 1111까지, 16진법으로는 0x0000 ~ 0 xFFFF까지 표현이 가능하다는 뜻이다.

 

 

여기서 유니코드는 0~127의 숫자는 ASCII와 동일한 의미를 갖는다. 예를 들어 10진법 65는 아스키 코드나 유니코드나 모두 'A'를 나타낸다. 

 

 

한글 프로그램을 사용해 본 사람이라면 유니코드 문자표를 본 적이 있을 것이다. 이처럼 유니코드는 알파벳뿐만 아니라 다양한 언어, 기호, 이모티콘 등등 엄청나게 많은 문자들을 표현할 수 있다.

 

유니코드 문자는 해당 글자의 코드를 표기할 때 주로 U+(16진수 숫자)의 형태로 쓴다. 예를 들어 한글 '가'는 유니코드에서 16진수로 AC00(=10진수 44032)라는 코드 넘버를 가지는데, 이를 U+AC00으로 적는 식이다.

 

 

유니코드는 초창기 2^16개의 문자를 표현할 수 있었지만, 이것마저 부족해지게 되자, Plane이라 불리는 17개의 영역이 각각 2^16개의 문자를 표현할 수 있도록 확장하였다. 여기서는 유니코드를 중점적으로 다루지 않을 거기 때문에 이 부분에 대한 내용은 아래 블로그를 참고하자.

 

https://code-lab1.tistory.com/233

 

아스키코드(ASCII Code)와 유니코드(Unicode)에 대하여

아스키 코드란? 아스키 코드(ASCII)는 American Standard Code for Information Interchange를 줄인 말이다. 이름 그대로 미국에서 정의한 정보 교환용 부호체계이다. 아스키 코드는 영문 알파벳을 사용하는 대표

code-lab1.tistory.com

 

 

 

 

 

 

utf-8 은 뭘까

사실 그래서 아까 유니코드 얘기를 했던 것이다. 두둥!!

utf-8 은 전 세계의 모든 문자를 표현할 수 있는 유니코드 문자 인코딩 방식 중 하나이다.

 

import 'dart:convert';

void main() {
  String text = 'Hello, world!';

  List<int> bytes = utf8.encode(text); // 문자열을 바이트 배열로 변환
  String base64Str = base64Encode(bytes); // 바이트 배열을 Base64 문자열로 인코딩

  print(base64Str); // SGVsbG8sIHdvcmxkIQ==
}

 

utf.8 로 인코딩함으로써 text 는 유니코드가 된다고 생각하면 된다

아까 유니코드는 몇 바이트라고? -> 2바이트다!

 

UTF 약어이고 원래 뜻은 (Unicode Transformation Format)이다. 즉, Unicode를 인코딩하는 방법이다. 8의미는 8비트 1바이트를 기준으로 인코딩한다

 

 

 

 

 

 

 

Base64 를 왜 사용하는 걸까

저 위의 코드에서 Base64 는 또 뭘까? 그리고 왜 사용하는 걸까? (질문 폭탄러..)

 

 

 

👀 Base64 인코딩

 

Base64 인코딩의 컨셉은 화면에 표시되지 않는 이진데이터(바이너리)를 출력 가능한 문자(ASCII)로 대체하는 것이다. 64란 이름을 쓰는 이유는 이 변환에 사용되는 글자가 총 64개라서 그렇다.

 

 

보통 아래와 같이 쓴다

  • A~Z: 26글자
  • a~z: 26글자
  • 0~9: 10글자
  • 기호 2글자: + 또는 /

 

그리고 마지막 연산 중에 모자라는 비트가 생기면 = 로 채워 넣는다. 그래서 보통 = 가 0-2개 정도 있다

 

 

 

근데 왜 ASCII 로 대체하는걸까?

Base64 인코딩에서 ASCII 문자열을 사용하는 이유는, ASCII 문자열은 거의 모든 컴퓨터 및 통신 시스템에서 지원되기 때문입니다. 
따라서, Base64 인코딩에서 ASCII 문자열을 사용하는 것은 크로스 플랫폼 및 다양한 시스템 간 호환성을 보장하기 위한 것입니다.

 

 

 

💡 Base64 인코딩 이유

Base64는 이메일이나 웹에서 바이너리 데이터를 안전하게 전송하고 저장하기 위해 개발되었다.

이는 이메일과 같은 텍스트 기반 프로토콜에서는 바이너리 데이터를 전송할 수 없기 때문이다.

 

예를 들어, 이미지나 첨부 파일과 같은 바이너리 데이터를 이메일로 전송하려면 Base64로 인코딩하여 문자열로 변환한 후 전송한다.

Base64 인코딩은 다양한 프로그래밍 언어와 플랫폼에서 지원된다.

대부분의 언어에서는 Base64 인코딩 및 디코딩을 수행하는 라이브러리를 제공하고 있다.

 

 

 

 

 

 

자! 그래서 정리해서

만약 "안녕하세요" 라는 문자열을 Base64 로 인코딩한다면 다음과 같은 과정을 거친다

 

  1. Base64로 인코딩할 때는, 먼저 해당 문자열을 바이트 문자열로 변환한다. (utf-8 인코딩 사용)
  2. 이 바이트 문자열은 이미 이진 데이터이므로, 따로 이진수로 변환하지 않는다.
  3. 그 다음, 이 바이트 문자열을 Base64 인코딩 알고리즘에 따라 텍스트로 변환한다.

 

 

'💻 컴퓨터 개론' 카테고리의 다른 글

x86, x64, x86_64, arm  (0) 2023.07.02
IP 관련 용어 정리  (0) 2023.06.10
ASP, PHP, JSP 가 무엇인지 모르겠는 사람들을 위해  (0) 2020.06.19
TCP/IP 에 대하여  (0) 2020.06.17
OSI 모델과 네트워크 장치  (0) 2020.06.17