Home Full Site
Base64 인코딩

Base64는 바이너리 데이타를 아스키 문자열로 표현하는 인코딩 방식의 하나이다. Base64는 영문 대문자(A ~ Z) 26개, 영문 소문자 (a ~ z) 26개, 그리고 숫자 (0 ~ 9) 10개 등 62개의 값들을 기본적으로 가지며, 마지막에 + 와 / 두개를 합쳐 총 64개의 인코딩 문자를 갖는다. 아래 도표는 각 문자에 대한 인코딩 값이다.

인코딩값 문자   인코딩값 문자   인코딩값 문자   인코딩값 문자
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

Base64 인코딩 과정

Base64는 64개의 데이타를 가지므로 6비트의 공간만 필요하다. 바이너리 데이타 즉 바이트들을 Base64 인코딩 데이타로 변환하기 위해서는 연속적인 바이트들을 앞에서부터 6비트씩 끊어서 이를 Base64 인코딩값으로 변환하면 된다.

바이트들의 모든 비트들을 남김없이 모두 Base64 인코딩값으로 변환하려면 바이트들의 숫자가 3의 배수 (3, 6, 9, ... )이어야 한다. 즉, 바이트 8비트와 Base64 6비트의 최소공배수인 24비트 (3 bytes)가 되면 3 바이트의 데이타를 짤림이 없이 4개의 Base64 인코딩값으로 표현할 수 있다. 예를 들어, ABC 라는 3개의 바이트가 있다면, 아래 그림과 같이 이를 6비트씩 쪼개 4개의 Base64 인코딩 문자로 변경할 수 있다. 만약 바이트의 숫자가 3의 배수가 아니라면, 아래에서 설명하는 Padding 과정을 거치게 된다.

C#에서 바이트들을 Base64로 변환하기 위해서는 간단하게 Convert.ToBase64String() 정적 메서드를 사용한다.


예제

// ABC 문자 바이트들
byte[] abc = new byte[] { 0x41, 0x42, 0x43 };

// 바이너리 데이타를 Base64로 변경
string base64 = Convert.ToBase64String(abc);

// 출력: QUJD
Console.WriteLine(base64);


Base64 인코딩 과정


Base64 패딩 (Padding)

바이트들을 Base64로 변환할 때, 만약 바이트의 숫자가 3의 배수가 아니라면, 빈 비트들을 패딩하게 된다. 예를 들어, 2 바이트를 Base64로 변환하는 경우, 나머지 1 바이트를 추가해 총 3바이트를 처리하는데, 가상으로 추가된 1 바이트는 모두 0 이라고 가정하고, 2 바이트를 6비트씩 모두 처리한 후 마지막 6비트는 Base64 패딩 문자인 = 을 추가하게 된다. 즉, 아래 그림을 보면, (1) AB 바이트에 대해 QU를 얻어내고 (2) B의 마지막 4비트와 패딩으로 들어간 2비트를 합쳐 I 를 얻어낸다. 그리고 마지막 6비트는 패딩으로 문자 = 을 추가해서 결국 QUI= 라는 Base64 인코딩 결과를 얻게 된다.

Base64 패딩은 만약 바이트수가 3의 배수이면 0개, (3의 배수 - 1) 이면, 1개, 그리고 (3의 배수 -2) 이면 2개가 된다.


예제

// AB 문자 바이트들
byte[] abc = new byte[] { 0x41, 0x42 };

// 바이너리 데이타를 Base64로 변경
string base64 = Convert.ToBase64String(abc);

// 출력: QUI=
Console.WriteLine(base64);


Base64 패딩 과정


문자열 Base64 인코딩과 디코딩

문자열을 Base64로 인코딩하기 위해서는 우선 문자열을 바이트배열로 전환해야 한다. 문자열을 바이트배열로 변환하기 위해서는 문자열 인코딩 아티클 에서 설명한 바와 같이 Encoding을 통해 변환하게 된다. 일단 바이트 배열로 변환한 후에는 Convert.ToBase64String() 를 사용하여 다시 Base64로 인코딩하면 된다. 아래 예제A는 문자열을 유니코드 바이트배열로 변경하여 다시 Base64 인코딩으로 변환한 예이다.

위의 인코딩의 반대 과정인 디코딩과정은 Base64로 인코드된 문자열을 Convert.FromBase64String() 메서드를 통해 다시 바이트배열로 변환하면 된다. 그리고 이어 이 바이트배열을 다시 유니코드 인코딩을 통해 (Encoding.Unicode.GetString() 메서드 사용) 원래의 문자열로 변환하게 된다.


예제

// ## 예제 A. 인코딩 ##
// 문자열을 유니코드 인코딩으로 바이트배열로 변환
string s = "John 굿모닝";
byte[] bytes = Encoding.Unicode.GetBytes(s);

// 바이트들을 Base64로 변환
string base64 = Convert.ToBase64String(bytes);

// 출력: SgBvAGgAbgAgAH+tqLrdsg==
Console.WriteLine(base64);


// ## 예제 B. 디코딩 ##
// Base64 인코드된 문자열을 바이트배열로 변환
byte[] orgBytes = Convert.FromBase64String("SgBvAGgAbgAgAH+tqLrdsg==");

// 바이트들을 다시 유니코드 문자열로
string orgStr = Encoding.Unicode.GetString(orgBytes);

// 출력: John 굿모닝
Console.WriteLine(orgStr);



© csharpstudy.com