· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
H3Z2

1. H3Z2


H3Z2은 텍스트엔코딩 형식입니다. 2006년 11월에 부들( 신동익 )에 의해 처음 고안되었으며 2008년 8월 GPL로 공개하는 엔코딩 형식입니다.

h3z2_mascot.png
[PNG image (9.39 KB)]
옆 그림은 완보동물을 그린것으로 H3Z2의 마스코트 입니다.완보동물은 물곰(water bear)라고도 불리며 미세하며 우주공간에서도 살수 있는 끈질긴 생물체라고 합니다. ____ <.)++++< budl 부들-- ikw3179 2008-08-20 01:19:12 mail:ikw3179@naver.com

  • 관련엔코딩 : Z3A2 : 바이너리에 적합한 엔코딩 형식

2. H3Z2 엔코드 형식


H3Z2를 고안하게 된 배경은 인공언어를 위한 여러가지 엔코딩 형식을 만들다가 우연히 발견하게 된 것으로 다음 등식에서 기인하게 되었습니다.

36 * 36 * 50 + 16 * 46 = 65536

보시다시피 65536은 2Byte 정수값입니다. 그리고 좌항의 36 , 50 , 16 , 46 은 조합할 문자의 수를 의미합니다. 모두 50 이하로 알파벳 대소문자를 합한 것 보다 작은 수입니다. 이것이 무엇을 의미 할까요?

즉 알파벳 3개 또는 2개로 2byte를 표현할 수 있다는 것이 됩니다. 또한 'H3Z2' 라는 명칭은 " 'H' 시작될 경우 3문자 'Z' 으로 시작될 경우 2문자 "라는 뜻을 의미합니다. 정규표현식을 사용하면 다음과 같습니다.

/ H - Y H - Y A - Y | Z A - G A - W / i

정규식의 맨끝 /i 는 대소문자에 모두 매치한다는 옵션입니다. 중요한 점은 3문자 코드의 시작인 H - Y 와 2문자 코드의 Z A - G 가 서로 겹치는 부분이 없다는 것입니다. 첫 알파벳으로 2문자코드가 될지 3문자 코드가 될지 구분할 수 있게 됩니다. 그리고 알파벳은 다음과 같이 배열된 순서대로 값이 증가하게 됩니다.


 [ H - Y ]  => HhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYy
 [ Z A - G ]  => ZzAaBbCcDdEeFfGg
 [ A - Y ] , [ A - W ] => AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz   


알파벳을 위와 같이 분배한 것은 다분히 임의적인 것으로 다른 의미는 없습니다. 대소문자가 반복된다는 것이 좀 색다릅니다. 위에 같은 형식에 따라 정수값을 변환하면 다음과 같은 결과가 됩니다.

ZA => 0
Za => 1
ZB => 2
Zb => 3
ZC => 4
Zc => 5
ZD => 6
Zd => 7
ZE => 8
Ze => 9
ZF => 10
Zf => 11
ZG => 12
Zg => 13
ZH => 14
Zh => 15
ZI => 16
Zi => 17
ZJ => 18
Zj => 19
ZK => 20
Zk => 21
ZL => 22
Zl => 23
ZM => 24
Zm => 25
ZN => 26
Zn => 27
ZO => 28
Zo => 29
ZP => 30
Zp => 31
ZQ => 32
Zq => 33
ZR => 34
Zr => 35
ZS => 36
Zs => 37
ZT => 38
Zt => 39
ZU => 40
Zu => 41
ZV => 42
Zv => 43
ZW => 44
Zw => 45
zA => 46
za => 47
zB => 48
zb => 49
zC => 50
zc => 51
zD => 52
zd => 53
zE => 54
ze => 55
zF => 56
zf => 57
zG => 58
zg => 59
zH => 60
zh => 61
zI => 62
zi => 63
zJ => 64
zj => 65
zK => 66
zk => 67
zL => 68
zl => 69
zM => 70
zm => 71
zN => 72
zn => 73
zO => 74
zo => 75
zP => 76
zp => 77
zQ => 78
zq => 79
zR => 80
zr => 81
zS => 82
zs => 83
zT => 84
zt => 85
zU => 86
zu => 87
zV => 88
zv => 89
zW => 90
zw => 91
AA => 92
Aa => 93
AB => 94
.
.
.
.
.
.
.
gF => 700
gf => 701
gG => 702
gg => 703
gH => 704
gh => 705
gI => 706
gi => 707
gJ => 708
gj => 709
gK => 710
gk => 711
gL => 712
gl => 713
gM => 714
gm => 715
gN => 716
gn => 717
gO => 718
go => 719
gP => 720
gp => 721
gQ => 722
gq => 723
gR => 724
gr => 725
gS => 726
gs => 727
gT => 728
gt => 729
gU => 730
gu => 731
gV => 732
gv => 733
gW => 734
gw => 735
HHA => 736
HHa => 737
HHB => 738
HHb => 739
HHC => 740
HHc => 741
HHD => 742
HHd => 743
HHE => 744
HHe => 745
HHF => 746
HHf => 747
HHG => 748
HHg => 749
HHH => 750
HHh => 751
HHI => 752
HHi => 753
HHJ => 754
HHj => 755
HHK => 756
HHk => 757
HHL => 758
HHl => 759
HHM => 760
HHm => 761
HHN => 762
HHn => 763
.
.
.
.
.
.
.
.
.
.
.
.
.
.
yyH => 65500
yyh => 65501
yyI => 65502
yyi => 65503
yyJ => 65504
yyj => 65505
yyK => 65506
yyk => 65507
yyL => 65508
yyl => 65509
yyM => 65510
yym => 65511
yyN => 65512
yyn => 65513
yyO => 65514
yyo => 65515
yyP => 65516
yyp => 65517
yyQ => 65518
yyq => 65519
yyR => 65520
yyr => 65521
yyS => 65522
yys => 65523
yyT => 65524
yyt => 65525
yyU => 65526
yyu => 65527
yyV => 65528
yyv => 65529
yyW => 65530
yyw => 65531
yyX => 65532
yyx => 65533
yyY => 65534
yyy => 65535

정수 0값은 ZA에 배정되고 65535값은 yyy에 배정됩니다. 736 값을 기준으로 그 미만이면 두자리 , 이상 이면 3자리 문자가 됩니다.

3. H3Z2 의 특징


텍스트 엔코딩에는 여러가지 종류가 있습니다. baae64와 같은 엔코딩 형식은 알파벳 숫자 그리고 '+' 기호를 사용하며 웹에서 전송을 위해 사용됩니다. 16진수 표기는 알파벳과 숫자를 사용하며 범용적으로 사용됩니다. 차이는 다음 표로 비교할수 있습니다.


2byte (16비트) 사용문자 용도 예( 'H3Z2' )
base64 3문자 알파벳 , 숫자 , 기호 ('+' , ) 웹 전송 'SDNaMg=='
16진수 4문자 알파벳 , 숫자 범용 '48335A32'
H3Z2 3~2 문자 알파벳 범용 'KwVKuC'

H3Z2은 알파벳만으로 엔코딩하며 길이면에서도 가장 효율적입니다.( 2byte 내에서 ) 단 2byte단위로 분리하기 때문에 마지막 Null문자 byte의 처리가 필요합니다. 기본적으로 문자열의 마지막 Null문자는 삭제합니다.

이러한 특징을 가지는 H3Z2은 범용적으로 사용될 수 있습니다.

예를 들어 소스코드에서 알파벳과 숫자조합으로 구성되는 변수명에 HTML형식의 태그 문자열을 엔코딩하여 넣을 수도 있습니다. 이와같은 프로젝트는 현재 진행중에 있습니다.

H3Z2 의 저작권은 GPL입니다. 필요에 따라 다양한 용도로 기능을 확장하여 활용하는 것이 가능합니다.


4. H3Z2 구현 프로그램


다음 H3Z2를 PHP로 구현한 클래스입니다.


<?php

/**

///////////////////////  H3Z2 ENCODE ///////////////////////

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

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

H3Z2 엔코딩 형식은 텍스트 또는 바이너리를  다양한 용도로 
사용할 수 있도록 하기 위한 텍스트 엔코딩 형식입니다.  
문자열(바이너리)을 2byte 단위씩 끊어서 2byte값( 0 ~ 65535 )을 
3개 또는 2개의 알파벳으로 변환시켜 줍니다. 

///////////////////////////////////////////////////
////      36 * 36 * 50 + 16 * 46 = 65536       ////
///////////////////////////////////////////////////

정규표현식 : [H-Y]{2}[A-Y]|[ZA-G][A-W]
 

H3Z2 가 base64 등의 텍스트 엔코딩과 다른 점은 알파벳만을
사용한다는 점으로 엔코딩된  문자열을 보다 다양한 용도로 
사용가능하게 됩니다. 16진 코드일 경우 2byte를 4개의 문자로
표현하는데 비해 H3Z2는 2개 또는 3 개의 문자로 표현하므로 
보다 효율적일 수 있습니다.
 
 ////////////////////////////////////////////////////////////////
 
*/

define H3Z2_DIV736 ); // 임계값 

//---------------12345678901234567890123456789012345678901234567890-----------//

$H3Z2[H]= "HhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYy" ;
$H3Z2[Z]= "ZzAaBbCcDdEeFfGg" ;
$H3Z2[A]= "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"   ;
$H3Z2_D = array() ;

class  
h3z2code
{    
////-------------  ENCODE ---------------/////

    
function    encode$input )
    {        
        
//문자열인경우 숫자배열로 전환 
        
if( is_string$input ))
        {                
            
//홀수 크기의 문자열인 경우 마지막 1 바이트를 C ( unsigned char ) 형식 판단하여 숫자형으로 바꾼다.
            
if( strlen$input ) %)
                    
$input unpack"v*/C1x" $input );
            else    
$input unpack'v*' $input );
        }
        
        if ( 
is_array$input ) ) // 배열
        
{
            foreach( 
$input as $a )
                
h3z2code::encode_core$Rstr $a ) ;
        }
        else if ( 
is_int $input )) // 정수
            
h3z2code::encode_core$Rstr $input ) ;            
      
        else  
trigger_error("입력값( $input )이 유효하지 않음 [".__FUNCTION__."]"E_USER_ERROR );
        
        return 
$Rstr ;
    }
    
    
//$rstr 에 결과를 추가함!!
    
function encode_core( &$rstr $codeVal )
    {
        global  
$H3Z2 ;

        if( 
$codeVal 0  ||  $codeVal >= 65536 
        
trigger_error("경계값( 0 ~ 65535 )을 벗어난 수치 \$codeVal = $codeVal [".__FUNCTION__."]"E_USER_ERROR );


        if( 
$codeVal H3Z2_DIV  // $codeVal < 736 ; 
        
{
          
$rstr  .=  $H3Z2[Z][ intval$codeVal 46 ) ].
                      
$H3Z2[A][ $codeVal %46  ] ;
        }
        else {  
// >= 736
        
$codeVal  -=  H3Z2_DIV  ;

        
$midVal  intval$codeVal 1800 );// 1800 = 36*50
        
$midRem  $codeVal 1800   ;

        
$rstr  .=   $H3Z2[H][ $midVal   ]. 
                    
$H3Z2[H][ intval$midRem 50 ) ].  
                    
$H3Z2[A][ $midRem 50  ] ;
        }  
        
//return 1 ; 

    
// function c3encode_subfunc ; 
    
    
////-------------  DECODE ---------------/////

    /// @function decode 는 H3Z2 문자열을 숫자의 배열 또는 원래의 문자열로 반환한다.
    /// $mode 값이 1 또는 2로 설정되면 바이너리 문자열로 반환하는 데 
    /// 1 이면 마지막 널문자를 제거하고 2이면 제거하지 않는다.
    /// 0 이면 배열값으로 반환한다.
    
function     decode$h3z2str $mode 1  )
    {            
        
$Rary = array() ;
        
$R "" ;       
      
        for(
$i ;  
            
// (.) 은 매치되지 않는 부분을 매치하는  것임
            //\G옵션을 사용하여 문자열의 시작부분이 매치되도록해야 한다. ^은 사용할수 없다.
            
preg_match"/\G(?:[H-Y]{2}[A-Y]|[ZA-G][A-W]|(.))/i" $h3z2str $match $i ) ;
            
$i += strlen$match[0] ) )
        {      
            if( 
$match[1] ){
                
                
trigger_error("입력 H3Z2코드( $h3z2str , $i:$match[1] )의 패턴오류  [".__FUNCTION__."]" E_USER_ERROR ) ;      
            }
            
            
$ecode  $match[0] ;
            
            
$dcode  h3z2code::decode_core$ecode )  ;        
            
            switch( 
$mode )
            {
              case 
array_push$Rary $dcode ) ;  break ; 
              
              
// 바이너리로 저장시 little endian 방식으로 반환 !!
              
case :  
              case 
$R .= pack"v" $dcode );  break ; 
            }
        }
      
        switch( 
$mode )
        {
            case 
:   return $Rary  ;         
        
            
// 가장 마지막 문자가 NULL문자 이면 제거한다.
            
case :   return  rtrim$R "\0" ); 
            case 
:   return $R ;
        }
        ;
    } 
// function decode  
      
      
    
function decode_init( )
    {
        if( 
$H3Z2_D ) return ; 
        
        global  
$H3Z2  $H3Z2_D ;  

        
$H3Z2_D[H] = array();
        
$H3Z2_D[Z] = array();
        
$H3Z2_D[A] = array();

        foreach( 
$H3Z2 as  $key => $val )
        {
            for( 
$i $i strlen($H3Z2[$key]); $i++ )
            {
              
$H3Z2_D[$key][$val[$i]] = $i 
            }  
        }
    }

    function 
decode_core$ecode )
    {  
        
h3z2code::decode_init( ); 
        
        global  
$H3Z2_D  ;    

        
$rVal 

        if( 
preg_match"/^([ZA-G])(.)/i" $ecode  $mch ) )
        {
            
$rVal =   $H3Z2_D[Z][$mch[1]]*46 
                      
$H3Z2_D[A][$mch[2]] ; 
        }
        else if( 
preg_match"/^([H-Y])([H-Y])(.)/i" $ecode  $mch ) )
        {
            
$rVal =   $H3Z2_D[H][$mch[1]]*1800 
                    
$H3Z2_D[H][$mch[2]]*50
                    
$H3Z2_D[A][$mch[3]] 
                    + 
H3Z2_DIV // 736 
        
}
        else
        {
            
trigger_error("입력 H3Z2코드( $ecode )의 패턴오류  [".__FUNCTION__."]" E_USER_ERROR ) ;
        }
        return  
$rVal ;
    }

}
//class  h3z2code



다음은 샘플 프로그램입니다.


<?php

include        dirname(__FILE__)."/h3z2code.php"    ;

$sample_text =<<<SAMPLE_TEXT
완보동물(緩步動物)은 물곰이라고도 불리는 동물의 한 문으로, 절지동물과 연관이 있다.

다 자란 성체의 최대 크기가 1.5mm이고, 작은 것은 0.1 mm가 채 되지 않는다. 8개의 발이 있어 곰처럼 걷는 모습으로 인해 물곰이라고 지었다고 한다.

현재까지 약 750 종이 발견되었다. 히말라야 산맥 정상에서 깊은 심해까지, 극 지방에서 적도까지 지구 전체에 걸처 퍼져 있다.

수분 공급 없이 10년을 살 수있다. 진공상태해도 살 수있다. 섭씨 151도로 끓여도 살고 -272도에서도 견딘다. 평균 수명은 150년이다. 5700 그레이(gray)의 X선도 견딜 수도 있다.  << 출처:위키백과 >>
SAMPLE_TEXT;

$H3Z2_CODE h3z2code::encode$sample_text );
$BASE64_CODE base64_encode$sample_text ) ; 
$re_sample_text h3z2code::decode$H3Z2_CODE );


print 
"<hr><b>원본 텍스트</b><pre>";
print 
wordwrap$sample_text  80"\n"); 

print 
"</pre><hr><b>H3Z2</b><p><code>";
print 
wordwrap$H3Z2_CODE 80"<br>");  

print 
"</code><hr><b>BASE64</b><p><code>";
print 
wordwrap$BASE64_CODE 80"<br>");  

print 
"</code><hr><b>복구 텍스트</b><pre>";
print 
wordwrap$re_sample_text  80"\n");  
print 
"</pre><hr>";


?>








sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-08-23 20:02:33
Processing time 0.0112 sec