整数値で10進数を使っているよりも、16進数を使ったほうが、データバイト数が節約できるが、これをもう少し拡張して、
数字[0-9]
大文字英字[A-Z]
小文字英字[a-z]
という風にすると、62進数ができあがる。
見た目的に暗号化しているようにも見えるので、便利に使える場面が多々あったので、下記にメモしておきます。
コード
/**
* 文字数縮小の為に10進数を62進数に変更
**/
class HEX62{
// chara-value
function chars(){
return array_merge(
range(0,9),
range('a','z'),
range('A','Z')
);
}
// num->id
function encode($n){
$char = $this->chars();
$cn = count($char);
$str = '';
while ($n != 0) {
$a1 = (int) ($n / $cn);
$a2 = $n - ($a1*$cn);
$str = $char[$a2].$str;
$n = $a1;
}
return $str;
}
// id->num
function decode($n){
$char = $this->chars();
$cn = count($char);
for ($i=0; $i<$cn; $i++) {
$chars[$char[$i]] = $i;
}
$str = 0;
for ($i=0; $i<strlen($n); $i++) {
$str += $chars[substr($n, ($i+1)*-1, 1)] * pow($cn, $i);
}
return $str;
}
}
使い方
$hex62 = new HEX62();
$num = 100000;
//10進数を62進数に変換
$num2 = $hex62->encode($num);
print_r($num2);
//62進数を10進数に戻す
$num3 = $hex62->decode($num2);
print_r($num3);
注意点
62進数にした文字をファイル名にした場合、ファイル名をソートした際に、10進数と並びが変わってしまうので、順番が重要な場合は注意しよう。
多言語対応
0 件のコメント:
コメントを投稿