· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Z3A2


1. Z3A2


Z3A2은 텍스트 엔코딩 형식이며 2008년 8월 부들에 의해 만들어졌으며 관련된 프로그램은 GPL저작권에 따릅니다.

z3a2_mascot.png
[PNG image (9.61 KB)]


  • 관련엔코딩 : H3Z2

  • 관련언어 : 빛깔언어 - Bitggal Language

2. Z3A2 엔코딩 형식


2.1. 기본원리


Z3A2H3Z2 와 유사한 엔코딩 체계로 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라는 명칭은 A2AA에 , Z3zzz에 대응하며 'AA'로 시작해서 'zzz'으로 끝나는 코드체계라는 의미를 내포합니다.

  • AA ~ dp : 1byte 0 ~ 256

  • EA ~ zzz : 2byte 0 ~ 65536



H3Z2Z3A2는 알파벳만을 사용하여 엔코딩하기 때문에 웹전송은 물론 다양한 응용이 가능합니다. 도메인명이나 파일명으로 사용하는 것이 가능하며 프로그램 소스파일에서 앞파벳 조합만으로 구성되야 할 토큰을 만들기 위해 사용할 수도 있습니다.

2.2. 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


3. Z3A2의 PHP구현 프로그램


3.1. 클래스 소스코드


<?php

/*
=== Z3A2 엔코딩 ===

// @생성 : 2008-8-22
// @만든이 : 신동익  <.)++++<  budl 
// @메일 : ikw3179@naver.com
// @저작권 : GPL

// @Z3A2 엔코딩형식에 대한 도움말 링크 : http://wiki.kldp.org/wiki.php/Z3A2

...
*/

defineZ3A2_DIV896 ) ; //임계값  28*32
defineZ3A2_MAX65792 ) ; //한계값   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 
            {    
//홀수 길이인 경우  마지막 1BYTE
                
$last_char_val ord$input$len -} ) ;
            }
                    
            
$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 ;  
            
// (.) 은 매치되지 않는 부분을 매치하는  것임
            //\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 $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 $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 ;
        
        
///[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( ); 


3.2. 샘플프로그램


<?
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>";


?>


3.3. 실행결과


다음은 위 샘플프로그램의 실행결과 입니다.

원본 텍스트
         ,----,  .--,-``-.
       .'   .`| /   /     '.     ,---,          ,----,
    .'   .'   ;/ ../        ;   '  .' \       .'   .' \
  ,---, '    .'\ ``\  .`-    ' /  ;    '.   ,----,'    |
  |   :     ./  \___\/   \   ::  :       \  |    :  .  ;
  ;   | .'  /        \   :   |:  |   /\   \ ;    |.'  /
  `---' /  ;         /  /   / |  :  ' ;.   :`----'/  ;
    /  ;  /          \  \   \ |  |  ;/  \   \ /  ;  /
   ;  /  /--,    ___ /   :   |'  :  | \  \ ,';  /  /-,
  /  /  / .`|   /   /\   /   :|  |  '  '--' /  /  /.`|
./__;       :  / ,,/  ',-    .|  :  :     ./__;      :
|   :     .'   \ ''\        ; |  | ,'     |   :    .'
;   |  .'       \   \     .'  `--''       ;   | .'
`---'            `--`-,,-'                `---'

http://ascii.dtools.net/ 에서 그림 
Z3A2

OsePuWPuWPuWPuWpYYQBcQBcPVCQDUQBcQBCSXEQdaOsePuWPuWPuWQDUPuzPuWSwFPvQPVdPuWPVdPu
WPuWQDxPuWPuWpYYQBcpyePuWPuWPuWPuWPuWQBCQBcpyeOsePuWPuWpMPPuWQDUPuzPuWQGfQDUQfZP
uWPuWPuWPuWPVjPuWPuzQDUPuzPvAPuWPuWPuWpMPPuWQDUPuzoaMPuLpYYQBcpyepMIPuWPuWpMPPvA
SXEPvAQDUQbCPuWPuWPuzPVdqJUPuWPuWQDxPuWpYYQBcQBcpMOPuWPuWoBCPuLtNUPuWqgWPuWPuWQD
UPVdSmGSufSNlPVdPuWPvAPuWqHJPuWPVJPuWPuWPuWPvAtNUPuWPuWPVJQDUPuWoAvPuLqJUPuWtNUQ
DUPuzQfSPuWPuWPuWPuWPvAPuWPVJPuWqhQPuWPvQPuWSmnPuWSmGqJUPuWPuWQEOPuzQfSOsePuWQbC
QBcPuzPVdqJUPuWPuWPuWPuWQfSPuWPVdPuWPVdPvQqgWPuWPuzQdhPuWqgWQbCQBcpMoPVdqJUOsePu
WPuWPVdqJUPuWPVdPuWPuWPuWPuWSmGPuWPvAPuWPvAPvQtNUPuWQGfPuWPvAPuWPvAPVdqJUPuWoApP
uLPuWPVjQfSPuWQBdpyePuWPuWSufPvbPVdPuWPVJPuWpNCPuWPVJtNUSmGPuWPvApMOPVjQfSPuWQBd
oAOPuLQfSPuWPVdQfSQDUtOAPuWQfSPuWQfSPvAPuWPVdPuWtnHPuWPvQpMIPuWQazpMoQfSPuWPVdQf
SSwFoBCQDJSUhqjzPuWPuWPuWqgWPuWPVdpyEPVdpMIQBCPuWPuWtnBPuWPVJqgWPuWPuWQDUSUhqjzP
uWPuWPuWoAVtNJPuWqgWPuWPuWQDUPuzPuWPvApMlPvAPuWPuWPuWqJUtNUPuWPvQpMOPuWPuWtNUPuW
qgWPuWPuWpMPOsePVjPuWPvQQDUPuzPuWPuWPuWPvAPuWPvAPuWPuWpMPPuWQbCpMoPuzPuWPuWPuWPV
jPuWPvQpMPOseQbCQBcPuzPuWPuWPuWPuWPuWSWYQBcQbCpyEpMoPuWPuWPuWPuWPuWPuWPuWPuWQbCQ
BcoAlOzXspXTuAqhKQfzTrssTnQEeTUSTIhTrYTFDTUsPVdvbzWfAWnSwgrPWROse

복구 텍스트

         ,----,  .--,-``-.
       .'   .`| /   /     '.     ,---,          ,----,
    .'   .'   ;/ ../        ;   '  .' \       .'   .' \
  ,---, '    .'\ ``\  .`-    ' /  ;    '.   ,----,'    |
  |   :     ./  \___\/   \   ::  :       \  |    :  .  ;
  ;   | .'  /        \   :   |:  |   /\   \ ;    |.'  /
  `---' /  ;         /  /   / |  :  ' ;.   :`----'/  ;
    /  ;  /          \  \   \ |  |  ;/  \   \ /  ;  /
   ;  /  /--,    ___ /   :   |'  :  | \  \ ,';  /  /-,
  /  /  / .`|   /   /\   /   :|  |  '  '--' /  /  /.`|
./__;       :  / ,,/  ',-    .|  :  :     ./__;      :
|   :     .'   \ ''\        ; |  | ,'     |   :    .'
;   |  .'       \   \     .'  `--''       ;   | .'
`---'            `--`-,,-'                `---'

http://ascii.dtools.net/ 에서 그림 


Replace original file
Rename if it already exist

ID
Password
Join
Money may buy friendship but money can not buy love.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-09-27 19:27:10
Processing time 0.0092 sec