메뉴 건너뛰기

프로그램언어

조회 수 13078 추천 수 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
번호 제목 날짜 조회 수
280 PHP와 HTML과 자바스크립트의 관계 2021.03.26 311
279 TIFF, GIF 여러장 변환 file 2021.03.26 323
278 정규표현식 2021.03.26 311
277 date() 함수의 출력 형식 2021.03.26 241
276 확장자 추출 하기 2021.03.26 308
275 서브도메인 세션 공유 2021.03.26 537
274 가변변수로 만든 배열 2021.03.26 272
273 HEREDOC <<< ( PHP에서 echo로 HTML쉽게 표시하기 ) 2021.03.26 371
272 배열 연산자 []= 에 대해서 2021.03.26 231
271 Predefined Variables (미리 정의된 변수들) 2021.03.26 274
270 current() next() key() 그외 배열관련 함수 2021.03.26 253
269 비교연산자 ( === 에 관해서 ) 2021.03.25 307
268 큰따옴표(") 와 작은따옴표(') 2021.03.25 270
267 mysql_free_result(); 관련 오류 2021.03.25 288
266 phpMyAdmin WebMysql 에 CSV 엑셀 파일 업로드 입력하기 ( Excel / Upload / data / 데이터 / 데이타 ) file 2021.03.25 754
265 PHP + 유튜브(youtube) 동영상 업로드 연동 소스 2021.01.21 1135
264 다중파일 업로드 + 이미지 미리보기 (Javascript, jQuery ) file 2020.12.15 912
263 경로 제외한 파일 이름만 선택하는 방법, Basename() 2020.11.23 429
262 쿠키 확인 후 만료시 세션 파괴하는 방법 2020.11.23 314
261 DAUM 지도 API 좌표→주소(주소->좌표) 변환 2020.10.05 431
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 17 Next
/ 17

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved