2進数を64進数に変換する

2進数を64進数に変換しようと思ったんだけど検索してもいい感じに出てこなかったから自分で書いた。

コード

<?php
$chars = array_merge(range(0,9), range('a','z'), range('A','Z'), array('+','/'));
$b64map = [];
foreach($chars as $k => $c) {
    $b64map[bn(decbin($k), 6)] = $c;
}

function binToB64($binnum) {
    $chars = array_merge(range(0,9), range('a','z'), range('A','Z'), array('+','/'));
    $b64map = [];
    foreach($chars as $k => $c) {
        $b64map[bn(decbin($k), 6)] = $c;
    }

    $length = strlen($binnum);
    for($m = 0; $m < $length; $m = $m + 6) {}
    $bin = bn($binnum, $m);
    $binArray = str_split($bin, 6);
    $b64 = "";
    foreach($binArray as $b)
        $b64 .= $b64map[$b];
    return $b64;
}

function bn($binnum, $n) {
    $length = strlen($binnum);
    $l = $n - $length;
    $zero = "";
    for($i = 0; $i < $l; $i++)
        $zero .= "0";
    return $zero .$binnum;
}
?>

仕組み

汚いコードなので忘れた時に備えて仕組みも書いておく。

まず2進数と64進数の変換表を作る。

2進数の桁が6n桁でない場合桁が6n桁になるまで上位桁を0で埋める。

次に文字列の2進数を6桁毎に区切る。

区切られた2進数をそれぞれ64進数に変換して結合する。

終わり。

感想

2も64も基数が2で揃っているので2進16進変換と同じ要領で変換できた。

デコード部分は今のところ使う予定が無いので作ってません。

より良い方法があれば教えてください。