메뉴 건너뛰기

프로그램언어

조회 수 4767 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


<?
/**************************************************
Base64 인코딩/디코딩 함수를 사용해보자
--------------------------------------------------
**************************************************/
// 귀차니즘 상수: 개행
define ( 'BR' , '<br>' ) ;

// 인코딩
$original = ‘a’ ;
$encode = base64_encode ( $original ) ;
echo $encode . BR ; // 결과: YQ==

// 디코딩 #01 : 인코딩 문자열 그대로 디코딩 시도
$decode = base64_decode ( $encode ) ;
echo $decode . BR ; // 결과: a
echo strlen ( $encode ) . BR ; // 결과: 4

// 디코딩 #02 : 인코딩 문자열에서 우측의 = 문자열 제거 후 디코딩 시도
$encode = rtrim ( $encode , ‘=’ ) ;
$decode = base64_decode ( $encode ) ;
echo $decode . BR ; // 결과: a
echo strlen ( $encode ) . BR ; // 결과: 2
?>

 

PHP 프로그램을 작성하시는 분들께서는 base64 인코딩/디코딩을 상당히 자주 사용하실 것이라고 생각됩니다.
URL 을 만들어야 하거나, MIME 타입 정의 할 때도 사용하고, 데이터베이스 및 파일에 암호화된 문자열을 넣어야 할 때도 쓰이지요. 혹은 소켓 통신 할때도 사용되구요.

하지만, 대부분의 개발자는 base64 인코딩/디코딩에 대해서 얼마나 이해하고 있을까요?
※ 넌 아냐? 글쓰는 이유를 합리화하고 있다. ㅡㅡ;
그래서, base64 인코딩/디코딩에 대한 심도 깊은(?) 공부를 해보기 위하여 간략한 테스트 프로그램을 작성해 보았습니다.

위에 표기된 예제 프로그램은 $string 변수에 할당된 문자열을 base64_encode 함수로 인코딩하고, 인코딩된 문자열이 할당된 $encode 변수를 두 가지 방식으로 디코딩하는 매우 간단한 프로그램(?) 입니다.

이 프로그램에서 $original 에 할당된 원문 문자열의 길이를 `a` 에서부터 `abcdefghijklmnopqrstuvwxyz` 까지 늘려가며 테스트를 진행한 결과, 다음과 같은 재미있는 – 정말 재미있는거 맞지? – 사실을 확인 할 수 있었습니다.

1. base64_encode 함수로 인코딩된 문자열은 인수로 전달된 문자열의 길이 수와 비례하여 늘어난다.
2. `인코딩 문자열의 byte = ( 인수 문자열의 byte / 3 )  * 4` 공식이 성립된다.
       ※ 단, 괄호 안의 값이 소수점이 나오면 올림하여 계산한다.
3. base64_encode 함수의 결과로 반환된 문자열의 `=` 문자는 자리 수 채우기 위한 용도다.
4. base64_encode 함수의 결과 문자열에서 `=` 문자를 제거해도, 디코딩에는 영향을 주지 않는다.
5. base64 함수는 한, 영, 특수문자 구분 없이 byte 로 계산된다.

확인된 사실을 목록으로 표현해보니… 완전히, 꿀꿀한게 학습 분위기만 풀풀 나는군요. ^^;
그럼, 좀 더 쉽게 이해하기 위해서 위의 예제 소스를 기반으로 이야기를 계속해 보겠습니다.
※ 고마해라~ 다 안다. 굳이 필요치 않다니까!

base64_encode 함수의 인수를 `a` 부터 `abcdef` 까지, 글자 수를 늘려가며 테스트 해본 결과는 다음과 같습니다.

echo base64_encode ( 'a' ) ; // 결과: YQ==
echo base64_encode ( 'ab' ) ; // 결과: YWI=
echo base64_encode ( 'abc' ) ; // 결과: YWJj

echo base64_encode ( ‘abcd’ ) ; // 결과: YWJjZA==
echo base64_encode ( ‘abcde’ ) ; // 결과: YWJjZGU=
echo base64_encode ( ‘abcdef’ ) ; // 결과: YWJjZGVm

 

위 실행 결과에서 확인된 바와 같이, `abc` 와 `abcdef` 를 인수로 전달한 경우를 제외하면, base64_encode 함수의 결과 문자열에는 항상 `=` 문자가 붙어 있습니다. 즉, base64_encode 함수는 인수의 문자열 길이(byte) 값이 3 으로 나누어 떨어질 때를 제외하면 모든 결과 문자열에는 `=` 문자가 붙는 것을 알 수 있습니다.

또한, base64_encode 함수의 결과 문자열은 인수로 전달된 문자열의 길이(byte)에 상관없이 언제나 4로 나누어 집니다.

왜 이런 결과가 나오는 걸까요?
※ 월래리!? 독자에게 질문질이냐??

base64 인코딩/디코딩 함수는 함수 이름에도 포함되어 있듯이, 인수로 전달된 문자열을 64bit 로 인코딩/디코딩하여 결과를 반환합니다. 즉, base64_encode 함수는 현재 시스템에서 사용하는 2진수 데이터를 64진수 데이터로 변경해서 표현하겠다는 의미입니다.
※ 64bit = 2 ^ 6

보편적으로 컴퓨터는 byte 라고 하여 8bit 를 기준으로 데이터를 표현하는 것이 일반적 – byte 에 대한 숨은 이야기도 꽤 재미(?) 있습니다 – 입니다. 즉, 64bit 는 2bit 의 6 제곱이므로, 8bit 로 표현된 데이터를 6bit 로 바꿔서 표현하게 됩니다.

bits

먼저, 8bit 로 구성된 문자열 `abc` 를 8bit 2진 문자열로 변환하면 `0110 0001 0110 0010 0110 0011` 이 됩니다.
이 값을 6bit 로 구분지어 각각의 값(10진수로 변환한 값)과 일치하는 base64 문자셋으로 변경하면 6bit 문자열이 완성됩니다.

여기서, base64 문자셋이란 a~z, A~Z, 0~9, +, / 로 이뤄진 문자코드 표로 각 문자의 10진 수 값은 다음과 같습니다.

code

그러나, 만약에 8bit 2진 문자열이 6bit 로 나누어지지 않고 남는다면 어떻게 될까요?

base64 인코딩은 24bit 단위로 나누어서 수행됩니다. 즉, 인코딩 대상 문자열을 3byte 씩 나누어서 인코딩을 하게 됩니다. 그러므로, 남는 비트가 생기면 나머지 값을 모두 0 으로 채워 넣게 됩니다.

bits2



List of Articles
번호 제목 날짜 조회 수
191 날짜계산 몇일까지.. [ ex)4 일전 new 표시 ] 2018.07.24 1049
190 게시판 내용 숨김 클릭시 내용 출력 [ 참고 ] 2018.07.24 1178
189 마우스 오버시 사진변환, 파일에러시 대체이미지 적용(소스일부) 2018.07.24 1166
188 PHP 소스코드 인코딩(암호화)하기 2018.07.19 1508
187 gcm 푸시 알림 php 테스트 2018.07.19 1547
186 PHP 특정 디렉토리에 있는 파일 갯수 구하기 2018.07.19 1366
185 fcm 푸시 알림 php 테스트 2018.07.19 1545
184 쿠폰번호 발행 업데이트판. (간단한 클래스화[PHP4 기준] 등...) 2018.07.19 1449
183 날짜, 시간 포맷하기 (PHP) 2018.07.04 1407
182 AJAX를 활용하여 JSON 댓글 처리하기 (PHP) 2018.07.04 1904
181 PHP 파일크기 단위 붙이기 (용량 변환) file size conversion source code 2018.07.04 1463
180 방금 INSERT 했던 SQL 문의 PK(primary key)값 가져오기 2018.07.04 1056
179 PHP 휴대폰번호 짜르기 (preg_replace) "-" 넣기. 형식바꾸기 2018.07.04 1083
178 [이클립스]PHP 개발환경 만들기 file 2018.07.04 1168
177 MySQL(MariaDB) 테이블 만들기 2018.03.28 2523
176 PHP 네이버블로그 원격 글쓰기 API 소스 file 2018.02.09 4409
175 PHP에서 암호화 encrypt 복호화 decrypt 해서 값을 넘기기 2018.02.09 4064
» base64 인코딩/디코딩 함수의 특징 file 2018.02.09 4767
173 PHP 날짜 함수 2017.04.13 11313
172 PHP, $_SERVER 변수 2017.04.13 12237
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
/ 11

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved