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;
}
?>
最近のコメント