메뉴 건너뛰기

프로그램언어

조회 수 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



  1. No Image 06Mar
    by
    2017/03/06 Views 17474 

    엑셀(*.xls) 화일을 PHP에서 읽기

  2. No Image 23Dec
    by
    2016/12/23 Views 17328 

    시간관련함수

  3. 게시판 페이징 기법과 개념

  4. PHP에서 Excel 파일을 만들 수 있는 PHPExcel

  5. No Image 06Mar
    by
    2017/03/06 Views 17109 

    지엠 웹에디터 v1.1 (저작권표시없음)|

  6. No Image 07Mar
    by
    2017/03/07 Views 17080 

    www가 붙은 도메인과 안붙은 같은 도메인, 로그인 세션 유지

  7. No Image 06Mar
    by
    2017/03/06 Views 17063 

    PHP 만년달력 소스

  8. No Image 07Mar
    by
    2017/03/07 Views 17004 

    php 내장함수

  9. No Image 06Mar
    by
    2017/03/06 Views 16707 

    PHP 날짜, 시간 관련 함수. date(), mktime()

  10. No Image 06Mar
    by
    2017/03/06 Views 16610 

    PHP의 유동변수!? - $a1 ~ $a2 같은 형식의 변수를 반복문 돌릴때...

  11. No Image 06Mar
    by
    2017/03/06 Views 15769 

    php로 db 컨트롤 1

  12. No Image 06Mar
    by
    2017/03/06 Views 15580 

    php 문자열관련 함수

  13. No Image 06Mar
    by
    2017/03/06 Views 15508 

    메일주소의 골뱅이를 그림처리하기

  14. base64 인코딩/디코딩 함수의 특징

  15. PHP 네이버블로그 원격 글쓰기 API 소스

  16. No Image 09Feb
    by
    2018/02/09 Views 10626 

    PHP에서 암호화 encrypt 복호화 decrypt 해서 값을 넘기기

  17. No Image 04Jul
    by
    2018/07/04 Views 8456 

    AJAX를 활용하여 JSON 댓글 처리하기 (PHP)

  18. No Image 28Mar
    by
    2018/03/28 Views 8154 

    MySQL(MariaDB) 테이블 만들기

  19. [이클립스]PHP 개발환경 만들기

  20. No Image 24Jul
    by
    2018/07/24 Views 7322 

    헤더이용 다운로드 받을시 바로열기부분 소스

Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 17 Next
/ 17

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved