« 巨大なバイナリログが生成されてディスクフルになった(MySQL4.x) | メイン | 閏年かどうか判定したい »

カテゴリー:数値 

基数変換したい

このエントリーを含むはてなブックマーク  livedoorクリップ  基数変換したいをdel.icio.usに追加  基数変換したいをYahoo!ブックマークに追加  基数変換したいをニフティクリップに追加

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文字でも通るっぽい)


上記ではいちいち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";


これまでの例は、あくまでPerl上で表現できる10進数から、n進数への変換方法だった。ではPerlで表現できないn進数(例えば2進数)から、16進数などに変換する場合はどうすれば良いだろうか?これは次のように記述すれば良い。

■n進数をn進数に

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




トラックバック

このエントリーのトラックバックURL:
http://katsubemakito.net/mt/mt-tb.cgi/572

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

VPSレンタルサーバー




クリエイティブ・コモンズ・ライセンス
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.