Z3A2은 텍스트 엔코딩 형식이며 2008년 8월 부들에 의해 만들어졌으며 관련된 프로그램은 GPL저작권에 따릅니다.
 [PNG image (9.61 KB)]
- 관련엔코딩 : H3Z2
- 관련언어 : 빛깔언어 - Bitggal Language
Z3A2는 H3Z2 와 유사한 엔코딩 체계로 1byte 또는 2byte 값을 2개,3개의 알파벳으로 변환시켜줍니다. Z3A2 1byte 와 2byte 를 구분하기 위해서 총 65792( 256 + 65536 )개의 코드를 사용합니다. 즉 대상 문자열 또는 바이너리를 2byte 와 1byte 단위로 분리하여 처리할 수 있습니다. 따라서 홀수 길이의 마지막 NULL값 1바이트 까지 처리할 수 있게 됩니다.
( H3Z2의 경우 직접지정 해야 )
알파벳 2문자와 3문자로 65792개의 조합을 만들 수 있는 경우는 다음과 같이 여러가지 경우가 있습니다.
65536 + 256
= 24*52*52 + 28*32
= 29*47*48 + 23*16
= 35*36*52 + 17*16
= 35*39*48 + 17*16
= 36*38*48 + 16*8
= 40*38*43 + 12*36
= 40*40*41 + 12*16
= 41*37*43 + 11*51
= 44*31*48 + 8*40
= 51*30*43 + 1*2
Z3A2는 제일 위의 24 * 52 * 52 + 28 * 32 식에 기인한 알파벳 조합을 사용합니다.
- 24 * 52 * 52 + 28 * 32 = 256 + 65536 = 65792
- 정규표현식 : / O - Z A - Z A - Z | A - N A - P /i
위 등식에서 24과 28의 합은 52로 알파벳의 대소문자합과 동일하므로 서로 중복되지 않게 조합할 수 있고 첫 알파벳 으로 3문자 조합과 2문자 조합인지를 판단할 수 있게 됩니다. ( A - N 와 O - Z 는 겹치는 부분이 없어야 함. )
각 자리의 알파벳은 다음 순서대로 증가값을 가지게 됩니다.
- O - Z =>
"OoPpQqRrSsTtUuVvWwXxYyZz" ;
- A - N =>
"AaBbCcDdEeFfGgHhIiJjKkLlMmNn" ;
- A - Z , A - P =>
"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" ;
1byte 0값은 'AA'가 되며 2byte 65536 은 'zzz'으로 됩니다.
Z3A2라는 명칭은 A2는 AA에 , Z3로 zzz에 대응하며 'AA'로 시작해서 'zzz'으로 끝나는 코드체계라는 의미를 내포합니다.
- AA ~ dp : 1byte 0 ~ 256
- EA ~ zzz : 2byte 0 ~ 65536
H3Z2 와 Z3A2는 알파벳만을 사용하여 엔코딩하기 때문에 웹전송은 물론 다양한 응용이 가능합니다. 도메인명이나 파일명으로 사용하는 것이 가능하며 프로그램 소스파일에서 앞파벳 조합만으로 구성되야 할 토큰을 만들기 위해 사용할 수도 있습니다.
H3Z2는 2byte단위로 처리하기 때문에 가장 마지막 NULL문자를 그대로 놔두거나 제거하게 됩니다. 따라서 문자열이 아닌 바이너리의 경우는 문제가 발생할 수 있습니다.
Z3A2는 이와 같은 단점을 보완하여 1byte의 값과 2byte의 값을 분리하여 코드를 할당하도록 함으로써 문제를 해결합니다. 따라서 Z3A2는 바이너리 데이타에 보다 적합한 엔코딩 형식이라 할 수 있습니다.
2.3. Z3A2의 코드값 보기 ¶
AA => 0 Aa => 1 AB => 2 Ab => 3 AC => 4 Ac => 5 AD => 6 Ad => 7 AE => 8 Ae => 9 AF => 10 Af => 11 AG => 12 Ag => 13 AH => 14 Ah => 15 AI => 16 Ai => 17 AJ => 18 Aj => 19 AK => 20 Ak => 21 AL => 22 Al => 23 AM => 24 Am => 25 AN => 26 An => 27 AO => 28 Ao => 29 AP => 30 Ap => 31 aA => 32 aa => 33 aB => 34 ab => 35 aC => 36 ac => 37 aD => 38 ad => 39 aE => 40 ae => 41 aF => 42 af => 43 aG => 44 ag => 45 aH => 46 ah => 47 aI => 48 ai => 49
| aJ => 50 aj => 51 aK => 52 ak => 53 aL => 54 al => 55 aM => 56 am => 57 aN => 58 an => 59 aO => 60 ao => 61 aP => 62 ap => 63 BA => 64 Ba => 65 BB => 66 Bb => 67 BC => 68 Bc => 69 BD => 70 Bd => 71 BE => 72 Be => 73 BF => 74 Bf => 75 BG => 76 Bg => 77 BH => 78 Bh => 79 BI => 80 Bi => 81 BJ => 82 Bj => 83 BK => 84 Bk => 85 BL => 86 Bl => 87 BM => 88 Bm => 89 BN => 90 Bn => 91 BO => 92 Bo => 93 BP => 94 . . . . . . .
| NJ => 850 Nj => 851 NK => 852 Nk => 853 NL => 854 Nl => 855 NM => 856 Nm => 857 NN => 858 Nn => 859 NO => 860 No => 861 NP => 862 Np => 863 nA => 864 na => 865 nB => 866 nb => 867 nC => 868 nc => 869 nD => 870 nd => 871 nE => 872 ne => 873 nF => 874 nf => 875 nG => 876 ng => 877 nH => 878 nh => 879 nI => 880 ni => 881 nJ => 882 nj => 883 nK => 884 nk => 885 nL => 886 nl => 887 nM => 888 nm => 889 nN => 890 nn => 891 nO => 892 no => 893 nP => 894 np => 895 OAA => 896 OAa => 897 OAB => 898 OAb => 899
| OAC => 900 OAc => 901 OAD => 902 OAd => 903 OAE => 904 OAe => 905 OAF => 906 OAf => 907 OAG => 908 OAg => 909 OAH => 910 OAh => 911 OAI => 912 OAi => 913 . . . . . . .
| . . . . . . . zZY => 65736 zZy => 65737 zZZ => 65738 zZz => 65739 zzA => 65740 zza => 65741 zzB => 65742 zzb => 65743 zzC => 65744 zzc => 65745 zzD => 65746 zzd => 65747 zzE => 65748 zze => 65749
| zzF => 65750 zzf => 65751 zzG => 65752 zzg => 65753 zzH => 65754 zzh => 65755 zzI => 65756 zzi => 65757 zzJ => 65758 zzj => 65759 zzK => 65760 zzk => 65761 zzL => 65762 zzl => 65763 zzM => 65764 zzm => 65765 zzN => 65766 zzn => 65767 zzO => 65768 zzo => 65769 zzP => 65770 zzp => 65771 zzQ => 65772 zzq => 65773 zzR => 65774 zzr => 65775 zzS => 65776 zzs => 65777 zzT => 65778 zzt => 65779 zzU => 65780 zzu => 65781 zzV => 65782 zzv => 65783 zzW => 65784 zzw => 65785 zzX => 65786 zzx => 65787 zzY => 65788 zzy => 65789 zzZ => 65790 zzz => 65791
|
<?php
/* === Z3A2 엔코딩 ===
// @생성 : 2008-8-22 // @만든이 : 신동익 <.)++++< budl // @메일 : ikw3179@naver.com // @저작권 : GPL
// @Z3A2 엔코딩형식에 대한 도움말 링크 : http://wiki.kldp.org/wiki.php/Z3A2
... */
define( Z3A2_DIV, 896 ) ; //임계값 28*32 define( Z3A2_MAX, 65792 ) ; //한계값 65792 = 65536 + 256
$Z3A2[Z] = "OoPpQqRrSsTtUuVvWwXxYyZz" ; $Z3A2[N] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNn" ; $Z3A2[A] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" ; $Z3A2_D = array() ;
class z3a2 {
////------------- ENCODE ---------------/////
//$input 는 바이너리 function encode( $input ) { //바이너리,문자열인경우 숫자배열로 전환 if( is_string( $input )) { //문자열을 2byte 정수값으로 만들되 마지막에 남는 1byte 가 있다면 따로 . $len = strlen( $input ) ; if( $len % 2 ) { //홀수 길이인 경우 마지막 1BYTE $last_char_val = ord( $input{ $len -1 } ) ; } $input = unpack( 'v*' , $input ); //모든 값에 256을 증가시키고 foreach( $input as $v ) { z3a2::encode_core( $Rstr , $v +256 ) ; } //마지막 바이트가 있으면 추가한다. if( $last_char_val ) z3a2::encode_core( $Rstr , $last_char_val ) ; } else if ( is_array( $input ) ) // 배열 { foreach( $input as $a ) z3a2::encode_core( $Rstr , $a ) ; } else if ( is_int ( $input )) // 정수 z3a2::encode_core( $Rstr , $input ) ; else trigger_error("입력값( $input )이 유효하지 않음 [".__FUNCTION__."]", E_USER_ERROR ); return $Rstr ; } function encode_core( &$rstr , $codeVal ) { global $Z3A2 ; // 입력값은 0 과 65792 미만의 값이여야 한다. if( $codeVal < 0 || $codeVal >= Z3A2_MAX ) // 65792 = 65536 + 256 trigger_error("경계값( 0 ~ 65791 )을 벗어난 수치 \$codeVal = $codeVal [".__FUNCTION__."]", E_USER_ERROR ); if( $codeVal < Z3A2_DIV ) // $codeVal < 896 ; { $rstr .= $Z3A2[N][ intval( $codeVal / 32 ) ]. $Z3A2[A][ $codeVal %32 ] ; } else{ // >= 896 $codeVal -= Z3A2_DIV ;
$midVal = intval( $codeVal / 2704 );//2704 = 52*52 $midRem = $codeVal % 2704 ;
$rstr .= $Z3A2[Z][ $midVal ]. $Z3A2[A][ intval( $midRem / 52 ) ]. $Z3A2[A][ $midRem % 52 ] ; } //return 1 ; } ////------------- DECODE ---------------/////
/// @function decode 는 Z3A2 문자열을 숫자의 배열 또는 원래의 바이너리로 반환한다. /// $mode 값이 true 이면 바이너리 반환 /// $mode 값이 false 이면 배열값으로 반환 function decode( $z3a2str , $mode = true ) { global $Z3A2 ; $Rary = array() ; $R = "" ; for($i = 0 ; // (.) 은 매치되지 않는 부분을 매치하는 것임 //\G옵션을 사용하여 문자열의 시작부분이 매치되도록해야 한다. ^은 사용할수 없다. ///[O-Z][A-Z][A-Z]|[A-N][A-P]/ preg_match( "/\G(?:([O-Z])[A-Z][A-Z]|[A-N][A-P]|(.))/i" , $z3a2str , $match , 0 , $i ) ; $i += strlen( $match[0] ) ) { if( $match[2] ){ //(.) ///////////////////////////////////// print $R . ": " .strlen( $z3a2str ) ." :" ; trigger_error("입력 Z3A2코드( $z3a2str , $i:$match[2] )의 패턴오류 [".__FUNCTION__."]" , E_USER_ERROR ) ; } //$match[1]은 단지 $match[0] 이 [O-Z]으로 시작하는지 판단하기 위한 것 $dcode = z3a2::decode_core( $match[0] , $match[1] ) ; if( $mode ) { if( $dcode <= 256 ) // 256 $R .= chr( $dcode ) ; //pack( "C" , $dcode ) ; else if( $dcode <= Z3A2_MAX ) $R .= pack( "v" , $dcode - 256 ) ; }else array_push( $Rary , $dcode ) ; } if( $mode ) return $R ; else return $Rary ; } // function decode( $z3a2str , $mode = 1 ) function decode_init( ) { global $Z3A2 , $Z3A2_D ; if( $Z3A2_D ) return ; //print "INIT D INIT D INIT D INIT D <br>";
$Z3A2_D[Z] = array(); $Z3A2_D[N] = array(); $Z3A2_D[A] = array();
foreach( $Z3A2 as $key => $val ) { for( $i = 0 ; $i < strlen($Z3A2[$key]); $i++ ) { $Z3A2_D[$key][$val[$i]] = $i ; } } } // $Z_mode 가 true 이면 [O-Z] 으로 시작 function decode_core( $ecode , $Z_mode ) { global $Z3A2_D ;
$rVal = 0 ; ///[O-Z][A-Z][A-Z]|[A-N][A-P]/ if( $Z_mode ) { $rVal = $Z3A2_D[Z][$ecode{0}]*2704 //2704 = 52*52 + $Z3A2_D[A][$ecode{1}]*52 + $Z3A2_D[A][$ecode{2}] + Z3A2_DIV ; // 896 } else { $rVal = $Z3A2_D[N][$ecode{0}]*32 + $Z3A2_D[A][$ecode{1}] ; } return $rVal ; } }
z3a2::decode_init( );
<? include dirname(__FILE__)."/z3a2.php" ;
$sample_text =<<<SAMPLE_TEXT
,----, .--,-``-. .' .`| / / '. ,---, ,----, .' .' ;/ ../ ; ' .' \ .' .' \ ,---, ' .'\ ``\ .`- ' / ; '. ,----,' | | : ./ \___\/ \ :: : \ | : . ; ; | .' / \ : |: | /\ \ ; |.' / `---' / ; / / / | : ' ;. :`----'/ ; / ; / \ \ \ | | ;/ \ \ / ; / ; / /--, ___ / : |' : | \ \ ,'; / /-, / / / .`| / /\ / :| | ' '--' / / /.`| ./__; : / ,,/ ',- .| : : ./__; : | : .' \ ''\ ; | | ,' | : .' ; | .' \ \ .' `--'' ; | .' `---' `--`-,,-' `---'
http://ascii.dtools.net/ 에서 그림
SAMPLE_TEXT;
$Z3A2_CODE = z3a2::encode( $sample_text ); $re_sample_text = z3a2::decode( $Z3A2_CODE );
//print '<br>sample_text : ' . strlen( $sample_text ); //print '<br>Z3A2_CODE : ' . strlen( $Z3A2_CODE ); //print '<br>re_sample_text : ' . strlen( $re_sample_text );
print "<hr><b>원본 텍스트</b><pre>"; print wordwrap( $sample_text , 80, "\n", 1 );
print "</pre><hr><b>Z3A2</b><p><code>"; print wordwrap( $Z3A2_CODE , 80, "<br>", 1 );
print "</code><hr><b>복구 텍스트</b><pre>"; print wordwrap( $re_sample_text , 80, "\n", 1 ); print "</pre><hr>";
?>
다음은 위 샘플프로그램의 실행결과 입니다.
원본 텍스트
,----, .--,-``-.
.' .`| / / '. ,---, ,----,
.' .' ;/ ../ ; ' .' \ .' .' \
,---, ' .'\ ``\ .`- ' / ; '. ,----,' |
| : ./ \___\/ \ :: : \ | : . ;
; | .' / \ : |: | /\ \ ; |.' /
`---' / ; / / / | : ' ;. :`----'/ ;
/ ; / \ \ \ | | ;/ \ \ / ; /
; / /--, ___ / : |' : | \ \ ,'; / /-,
/ / / .`| / /\ / :| | ' '--' / / /.`|
./__; : / ,,/ ',- .| : : ./__; :
| : .' \ ''\ ; | | ,' | : .'
; | .' \ \ .' `--'' ; | .'
`---' `--`-,,-' `---'
http://ascii.dtools.net/ 에서 그림
Z3A2OsePuWPuWPuWPuWpYYQBcQBcPVCQDUQBcQBCSXEQdaOsePuWPuWPuWQDUPuzPuWSwFPvQPVdPuWPVdPu WPuWQDxPuWPuWpYYQBcpyePuWPuWPuWPuWPuWQBCQBcpyeOsePuWPuWpMPPuWQDUPuzPuWQGfQDUQfZP uWPuWPuWPuWPVjPuWPuzQDUPuzPvAPuWPuWPuWpMPPuWQDUPuzoaMPuLpYYQBcpyepMIPuWPuWpMPPvA SXEPvAQDUQbCPuWPuWPuzPVdqJUPuWPuWQDxPuWpYYQBcQBcpMOPuWPuWoBCPuLtNUPuWqgWPuWPuWQD UPVdSmGSufSNlPVdPuWPvAPuWqHJPuWPVJPuWPuWPuWPvAtNUPuWPuWPVJQDUPuWoAvPuLqJUPuWtNUQ DUPuzQfSPuWPuWPuWPuWPvAPuWPVJPuWqhQPuWPvQPuWSmnPuWSmGqJUPuWPuWQEOPuzQfSOsePuWQbC QBcPuzPVdqJUPuWPuWPuWPuWQfSPuWPVdPuWPVdPvQqgWPuWPuzQdhPuWqgWQbCQBcpMoPVdqJUOsePu WPuWPVdqJUPuWPVdPuWPuWPuWPuWSmGPuWPvAPuWPvAPvQtNUPuWQGfPuWPvAPuWPvAPVdqJUPuWoApP uLPuWPVjQfSPuWQBdpyePuWPuWSufPvbPVdPuWPVJPuWpNCPuWPVJtNUSmGPuWPvApMOPVjQfSPuWQBd oAOPuLQfSPuWPVdQfSQDUtOAPuWQfSPuWQfSPvAPuWPVdPuWtnHPuWPvQpMIPuWQazpMoQfSPuWPVdQf SSwFoBCQDJSUhqjzPuWPuWPuWqgWPuWPVdpyEPVdpMIQBCPuWPuWtnBPuWPVJqgWPuWPuWQDUSUhqjzP uWPuWPuWoAVtNJPuWqgWPuWPuWQDUPuzPuWPvApMlPvAPuWPuWPuWqJUtNUPuWPvQpMOPuWPuWtNUPuW qgWPuWPuWpMPOsePVjPuWPvQQDUPuzPuWPuWPuWPvAPuWPvAPuWPuWpMPPuWQbCpMoPuzPuWPuWPuWPV jPuWPvQpMPOseQbCQBcPuzPuWPuWPuWPuWPuWSWYQBcQbCpyEpMoPuWPuWPuWPuWPuWPuWPuWPuWQbCQ BcoAlOzXspXTuAqhKQfzTrssTnQEeTUSTIhTrYTFDTUsPVdvbzWfAWnSwgrPWROse
복구 텍스트
,----, .--,-``-.
.' .`| / / '. ,---, ,----,
.' .' ;/ ../ ; ' .' \ .' .' \
,---, ' .'\ ``\ .`- ' / ; '. ,----,' |
| : ./ \___\/ \ :: : \ | : . ;
; | .' / \ : |: | /\ \ ; |.' /
`---' / ; / / / | : ' ;. :`----'/ ;
/ ; / \ \ \ | | ;/ \ \ / ; /
; / /--, ___ / : |' : | \ \ ,'; / /-,
/ / / .`| / /\ / :| | ' '--' / / /.`|
./__; : / ,,/ ',- .| : : ./__; :
| : .' \ ''\ ; | | ,' | : .'
; | .' \ \ .' `--'' ; | .'
`---' `--`-,,-' `---'
http://ascii.dtools.net/ 에서 그림
|
|