2014년 11월 1일 토요일

Base64
base64 인코딩은 모든 8비트 문자를 64개의 문자로 표시하기 위한 것으로
(64개의 문자로 표현하는 이유는 어느나라에서나 표현 가능하기 때문에 통신상에 아무런 문제가 없음.) 64개를 표현하는데는 6비트가 필요하며 64개의 문자는 아래와 같다.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
(대문자 A 가 0부터이고 마지막 = 는 Padding 문자)

원칙은 Encoding 될 문자열을 6 비트로 끊어준다는 것과(위의 64개 문자로 표현하기 위해서) Encoding 될 문자열의 총 Bit 수를 3으로 나눈 나머지수만큼 '=' 로 Padding 한다는 것이다.

예를 들어 klmn 이란 4byte 짜리를 Base64 로 Encoding 해보자.
1. klmn 을 ASCII 값 기준 비트로 나타내 본다면, 각각 아스키값으로(107,108,109,110)
01101011 01101100 01101101 01101110

2. 6 bit 씩 끊어보면,
011010 110110 110001 101101 011011 10

3. 끝자리에 모자란 bit 를 0으로 셋팅
011010 110110 110001 101101 011011 100000

-> 26, 54, 49, 45, 27, 32
위의 64개 문자와 matching 시키면 a2xtbg 이고 전체비트수%3 가 2였으므로 두개의 '=' 로 Paddig 해주면
a2xtbg== 가 된다.

Base64를 이용하는 이유는, 웹상이나 여러 환경 등에서 Only ASCII Text만을 이용하여 데이터를 인코딩할 수 있기에 쓰지요..

예를들어, 영화 한편을 채팅방에서 별다른 데이터 형식 없이 뿌리고 싶을때...
초 옛날에 이메일로 파일 전송할때 자주 쓰던 방법이죠. 파일 첨부가 안 되서, 인코딩 해서 보내면, 그거 복사해서 파일로 만들고 디코딩.. -_-;

아시다시피, 0~31까지라던가의 ASCII 데이터는 문자로 표현이 안되니까요,,,

왜 6으로 나눈 비트수만큼 패딩하지 않고 3인지..1 #
핵심은 6비트로 표현하기 위해 3바이트를 4바이트로 표현한다는 것 입니다.. 3*8 = 4*6 = 24비트..
이 원리로 만들려면 항상 3바이트씩 쪼개내서 4바이트를 만들어야 인코딩 디코딩시 빠지는 데이터가 없는데 인코딩할 모든 데이터가 항상 3으로 나눠 떨어질 수 없는 경우가 있는거죠..
3으로 나눠 떨어지면 패딩이 필요 없으나, 1바이트 부족하거나 2바이트 부족한 경우는 패딩을 해야겠죠.. =문자 1글자가 1바이트니 부족분 만큼 패딩하는거죠..
그래야 디코딩할때는 4바이트씩 딱딱 나눠떨어지게 잘라내서 디코딩을 하면 3바이트씩 나오게 되는 것이고 남는 패딩은 무시하고..



BASE64 인코딩  
base64 인코딩은 모든 8비트 문자를 64개의 문자로 표시하기 위한 방법이다.
64개를 표현하는데는 2의 6승.. 즉, 6비트가 필요하다
왜 64개의 문자로 표현하느냐면
이것은 어느나라에서나 표현이 가능한 문자이기 때문이다.

예를 들면 ''abc''의 경우 ascii 값이 65, 66, 67 인데 이것을 2진수로 표현하면,

01000001, 01000010, 01000011

위에서 6비트씩 자른다.. 이때 쉬프트 연산을 한다.
첫번째, a를 오른쪽 2칸,
두번째, a의 상위 6비트 날리고, b를 오른쪽 4칸, 그다음에 or
세번째, b의 상위 4비트 날리고, c를 오른쪽 6칸, 그다음에 or
네번째, c의 상위 2비트 날림.

010000, 010100, 001001, 000011

이것을 10진수로 바꾸면,

16, 20, 9, 3

이숫자는 64개의 문자열의 처음부터 몇번째 문자인가를 나타낸다.
다시 변환해보면,
(64개 문자는 "A~Z", "a~z", "0~9", "+", "/" ==> 64개)

p, t, i, c

결론은, abc -> ptic 가 되는 것..

위의 예는 영문으로 했는데.. 한글과 같은 2바이트 문자에서도 64개의 문자로
표현이 가능하다.
또한, 위에서 보았듯이 3바이트가 4바이트로 길이가 늘어 난다.

그럼.. 문자열이 5바이트이면..?
이것도 8바이트가 되지만 마지막 모자라는 부분은 = 기호로 매꾸어진다.
상세설명 : 기본 3바이트를 4바이트가 되게 만든다..
마지막에 2바이트가 남을경우..일단..6비트씩 자르고 4비트 남으면 뒤를 00으로 채우는데..
그렇게 하면 6비트씩 3개가 되며, 6비트씩 4개를 만들려면 1바이트가 더 필요하므로,
그 1바이트를 = 으로 채운다..
마직막에 1바이트가 남을경우..일단..6비트씩 자르고 2비트 남으면 뒤를 0000으로 채워
6비트를 만든다..그럼 6비트 2개되고,,6비트씩 4개를 만들려면 6비트 2개가 더 필요한데..
= 를 두개 채워... ==으로 만든다..

Base64 인코딩 원리

베이스가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는
2^6 = 64 즉 6 비트 2진수 열이 필요하다.

그런데 대개 컴퓨터에서 가장 기본이 되는 정보 단위는 8 비트씩 엮어진 바이트이므로
6비트와 8비트가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24비트가 된다.

24비트는 8비트 바이트에서는 3바이트가 되고, 64진수로 나타내기 위한 6비트 단위로는 4 단위가 된다. (바이트라고 반복하기 말하면 혼동이 될 것 같아서 "단위"라는 말로 대치하였다.)

따라서 Base64의 인코딩 원리는 3바이트 단위마다 (즉 24비트 마다) 6비트씩 쪼개어서 6비트 짜리 문자 4개로 만드는 것이 되겠다.

이 때 6비트씩 쪼개진 단위를 A-Z a-z 0-9 +- (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.

댓글 없음:

댓글 쓰기