메뉴 건너뛰기

프로그램언어

조회 수 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
번호 제목 날짜 조회 수
320 CodeIgniter에서 PHPExcel 사용하기 file 2017.03.06 20289
319 csv파일 다루기. fputcsv(), fgetcsv() 2021.03.26 558
318 cUrl를 이용한 json 데이타 주고 받기 2020.09.28 1253
317 curl을 이용하여 post, get 방식 으로 데이터 전송하기 2023.01.12 333
316 current() next() key() 그외 배열관련 함수 2021.03.26 253
315 date() 함수의 출력 형식 2021.03.26 241
314 DAUM 지도 API 좌표→주소(주소->좌표) 변환 2020.10.05 431
313 DB 내용을 화면에 출력(이중 for 문) 2015.04.14 21246
312 DB 연동 4단 셀렉트 박스 2018.09.28 6085
311 DB상의 많은 파일을 한꺼번에 다운받기 2014.02.27 28332
310 dddotag - 허용하지 않는 태그 걸러내기 2019.01.16 1850
309 Drag/Drop HTML elements 2014.03.26 19535
308 ereg(), eregi(), ereg_replace(), eregi_replace(), split() 대체 2023.01.12 227
307 explode - 문자열 나눔 2016.12.23 19943
306 fcm 푸시 알림 php 테스트 2018.07.19 6048
305 fileatime 파일에 최종적으로 접근한 시간을 반환 2016.12.23 18117
304 fopen 파일 열기 2015.04.14 20297
303 FPDF - PHP로 PDF 만들기 2014.02.27 21084
302 gcm 푸시 알림 php 테스트 2018.07.19 5582
301 gd_info 사용 가능한 GD 라이브러리에 대한 정보를 배열로 반환 2016.12.23 17989
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 17 Next
/ 17

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved