2進数を10進数、10進数を16進数など、基数変換には「Math::BaseCalc」モジュールを使用すると楽に行える。Math::BaseCalcモジュールは別途インストールが必要な場合があるので注意。
サンプル
;#
;#基数変換
;#
use Math::BaseCalc;
#-- 10進数を2進数に変換 --#
$calc = new Math::BaseCalc(digits => [0,1]);
$value = $calc->to_base(100);
print $value, "\n";
#-- 10進数を8進数に変換 --#
$calc = new Math::BaseCalc(digits => [0..7]);
$value = $calc->to_base(100);
print $value, "\n";
#-- 10進数を16進数に変換 --#
$calc = new Math::BaseCalc(digits => [0..9, 'A'..'F']);
$value = $calc->to_base(100);
print $value, "\n";
実行例
1100100
144
64
砕いて言うなら、newする際(インスタンスを生成する際)に、digits⇒以降に指定した文字に置き換えてくれるのがMath::BaseCalcモジュールの機能だ。digitsで指定するのは数字、英数、記号など何でも良い(全角など2byte文字でも通るっぽい)
サンプル その2 別の書き方
上記ではいちいちnewしているが、(そんなケースがあるか分からないが)連続して使用する場合は次のように書くのがスマートだ。
use Math::BaseCalc;
#-- 10進数を2進数に変換 --#
$calc = new Math::BaseCalc(digits=>[0,1]);
print $calc->to_base(100), "\n";
#-- 10進数を8進数に変換 --#
$calc->digits([0..7]);
print $calc->to_base(100), "\n";
#-- 10進数を16進数に変換 --#
$calc->digits([0..9, 'A'..'F']);
print $calc->to_base(100), "\n";
サンプル その3 n進数をn進数に
これまでの例は、あくまでPerl上で表現できる10進数から、n進数への変換方法だった。ではPerlで表現できないn進数(例えば2進数)から、16進数などに変換する場合はどうすれば良いだろうか?これは次のように記述すれば良い。
use Math::BaseCalc;
$calc2 = new Math::BaseCalc(digits=>[0,1]);
$calc10 = new Math::BaseCalc(digits=>[0..9]);
$calc16 = new Math::BaseCalc(digits=>[0..9, 'A'..'F']);
#-- 2進数を10進数に変換 --#
print $calc10->to_base(
$calc2->from_base('11110001')
), "\n";
#-- 2進数を16進数に変換 --#
print $calc16->to_base(
$calc2->from_base('11110001')
), "\n";
余談になるが、digits ⇒['A'..'Z','a'..'z',0..9,'+','/']
とすれば、base64エンコード代わりに使用できる。またランダムな文字列を指定し、簡単な暗号化や、ランダムな文字列を生成したい場合などにも、お手軽な手段として使用することが出来る。
このブログを応援する
お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。