· 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



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.0113 sec