開発畑トップ   »  PHP   »  10進数<->多進数変換スクリプトを書いてみた。

10進数<->多進数変換スクリプトを書いてみた。

2013年02月11日

Category:PHP

tag: 62進数 , 90進数 , PHP , 多進数

つい最近まで16進数より上があるって事知りませんでした(汗

例えば62進数とかは0~9、a~z、A~Zの62文字を使って表示するらしいです。

ってことは、$とか%とかの記号も使えば90進数とかそれ以上でも出来ちゃうわけですね!
ってことで作ってみました。


こっちが、10進数->多進数変換用関数。
function dec2multi($str, $charlist = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
	$charlen = strlen($charlist);

	$dst = '';
	while ($str) {
		$dst = $charlist[fmod($str, $charlen)] . $dst;
		$str = floor($str / $charlen);
	}
	return strval($dst);
}
で、こっちが多進数->10進数変換用関数
function multi2dec($str, $charlist = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
	$charlen = strlen($charlist);

	$dst = 0;
	$cnt = strlen($str);
	for ($i = 0; $i < $cnt; $i++) {
		$dst += strpos($charlist, $str[$i]) * pow($charlen, $cnt - $i - 1);
	}
	return $dst;
}

使い方は、以下の通り

第1引数だけ指定した場合は62進数に変換します。
で、第2進数に変換する文字列をいれれば、その文字数の進数変換します。

echo dec2multi("1234567890"); //62進数になります。
echo '<hr />';
echo dec2multi("1234567890", "0123456789abcdef"); //16進数になります。
echo '<hr />';
echo dec2multi("1234567890", "01"); //2進数になります。
echo '<hr />';
echo dec2multi("1234567890", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()-=+*_[]{}@:;~^|/.,<>?"); //90進数になります。
echo '<hr />';

// 以下全てちゃんと10進数にもどります。
echo multi2dec('1ly7vk');
echo '<hr />';
echo multi2dec("499602d2", "0123456789abcdef");
echo '<hr />';
echo multi2dec("1001001100101100000001011010010", "01");
echo '<hr />';
echo multi2dec("i_J+0", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()-=+*_[]{}@:;~^|/.,<>?");

これで、最大94進数くらいまではいけるんじゃないかな。

あ、上記スクリプトはご自由にお使いください。ライセンスは?って聞かれたら、一応MITライセンスじゃない?って回答しときますw

コメントをどうぞ!