基数変換を行う - Perl

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エンコード代わりに使用できる。またランダムな文字列を指定し、簡単な暗号化や、ランダムな文字列を生成したい場合などにも、お手軽な手段として使用することが出来る。