[[tableofcontents]] == H3Z2 == H3Z2은 텍스트엔코딩 형식입니다. 2006년 11월에 [부들]( 신동익 )에 의해 처음 고안되었으며 2008년 8월 GPL로 공개하는 엔코딩 형식입니다. ||attachment:h3z2_mascot.png|| 옆 그림은 완보동물을 그린것으로 H3Z2의 마스코트 입니다.완보동물은 물곰(water bear)라고도 불리며 미세하며 우주공간에서도 살수 있는 끈질긴 생물체라고 합니다. ____ <.)++++< budl [부들]-- [ikw3179] [[DateTime(2008-08-19T16:19:12)]] [mail:ikw3179@naver.com] || * 관련엔코딩 : Z3A2 : 바이너리에 적합한 엔코딩 형식 == 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 }}} 알파벳을 위와 같이 분배한 것은 다분히 임의적인 것으로 다른 의미는 없습니다. 대소문자가 반복된다는 것이 좀 색다릅니다. 위에 같은 형식에 따라 정수값을 변환하면 다음과 같은 결과가 됩니다. {{{#!HTML
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자리 문자가 됩니다. * H3Z2 전체코드 맵파일 attachment:h3z2code.TXT == 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'''입니다. 필요에 따라 다양한 용도로 기능을 확장하여 활용하는 것이 가능합니다. == H3Z2 구현 프로그램 == 다음 H3Z2를 PHP로 구현한 클래스입니다. ---- {{{#!php = 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 = 0 ; // (.) 은 매치되지 않는 부분을 매치하는 것임 //\G옵션을 사용하여 문자열의 시작부분이 매치되도록해야 한다. ^은 사용할수 없다. preg_match( "/\G(?:[H-Y]{2}[A-Y]|[ZA-G][A-W]|(.))/i" , $h3z2str , $match , 0 , $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 0 : array_push( $Rary , $dcode ) ; break ; // 바이너리로 저장시 little endian 방식으로 반환 !! case 1 : case 2 : $R .= pack( "v" , $dcode ); break ; } } switch( $mode ) { case 0 : return $Rary ; // 가장 마지막 문자가 NULL문자 이면 제거한다. case 1 : return rtrim( $R , "\0" ); case 2 : 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 = 0 ; $i < strlen($H3Z2[$key]); $i++ ) { $H3Z2_D[$key][$val[$i]] = $i ; } } } function decode_core( $ecode ) { h3z2code::decode_init( ); global $H3Z2_D ; $rVal = 0 ; 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 > SAMPLE_TEXT; $H3Z2_CODE = h3z2code::encode( $sample_text ); $BASE64_CODE = base64_encode( $sample_text ) ; $re_sample_text = h3z2code::decode( $H3Z2_CODE ); print "
원본 텍스트
";
print wordwrap( $sample_text  , 80, "\n", 1 ); 

print "

H3Z2

"; print wordwrap( $H3Z2_CODE , 80, "
", 1 ); print "


BASE64

"; print wordwrap( $BASE64_CODE , 80, "
", 1 ); print "


복구 텍스트
";
print wordwrap( $re_sample_text  , 80, "\n", 1 );  
print "

"; ?> }}} ---- * 첨부파일 : attachment:h3z2_class.zip ----