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