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;
}

?>