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


?>






ID
Password
Join
Your aims are high, and you are capable of much.


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