62進数なんてどこかの古代文明かって感じですが、たとえばたくさんの数値をGETパラメータで渡したいが、クエリーの長さに制限のあるような環境の場合、数値を62進数にすれば桁数が減りますよね。そんなニーズで作ったものです。参考までにコード公開。
16進数は、0,1,2,3,・・・,8,9,A,B,C,D,E,Fで桁があがりますが、62進数は、0,1,2,3,・・・,8,9,a,b,c,・・・,x,y,z,A,B,C,・・・,X,Y,Zまできて桁があがります。数値、小文字、大文字という順ですね。数字が10文字、小文字が26文字、大文字が26文字なので合計で62あるのだ。
<?php // 62進数を10進数に変換 function dec62to10( $dec62 ) { $dec62 = trim( $dec62 ); if ( !preg_match( '/^[0-9a-zA-Z]*$/', $dec62 ) ) { trigger_error( "62進数を指定してください。", E_USER_ERROR ); } if ( !$dec62 ) { return 0; } $digits = strlen( $dec62 ); $lower_a = unpack( 'C', 'a' ); $upper_a = unpack( 'C', 'A' ); $dec10 = 0; $code = unpack( 'C', $dec62 ); for ( $i=1; $i<=$digits; $i++ ) { $char = substr( $dec62, $i-1, 1 ); if ( preg_match( '/[a-z]/', $char ) ) { $num = 10 + $code[ $i ] - $lower_a[1]; } elseif ( preg_match( '/[A-Z]/', $char ) ) { $num = 36 + $code[ $i ] - $upper_a[1]; } else { $num = $char; } $dec10 += pow( 62, $digits - $i ) * $num; } return $dec10; } // 10進数を62進数に変換 function dec10to62( $dec10 ) { $dec10 = trim( $dec10 ); if ( !preg_match( '/^\d*$/', $dec10 ) ) { trigger_error( "10進数を指定してください。", E_USER_ERROR ); } if ( !$dec10 ) { return 0; } $lower_a = unpack( 'C', 'a' ); $upper_a = unpack( 'C', 'A' ); $digits = 0; do { $digits++; } while ( $dec10 / pow( 62, $digits - 1 ) >= 1 ); $digits--; $dec10_tmp = $dec10; $dec62 = ''; for ( $i=1; $i<=$digits; $i++ ) { $digit_num = floor( $dec10_tmp / pow( 62, $digits - $i ) ); if ( $digit_num < 10 ) { $dec62 .= $digit_num; } elseif ( $digit_num < 36 ) { $dec62 .= pack( 'C', $digit_num - 10 + $lower_a[1] ); } else { $dec62 .= pack( 'C', $digit_num - 36 + $upper_a[1] ); } $dec10_tmp -= $digit_num * pow( 62, $digits - $i ); } return $dec62; } ?>
最近のコメント