基数変換を行う – Perl

  • このエントリーをはてなブックマークに追加
  • LINEで送る
この記事は 2007年2月16日 に書かれたものです

2進数を10進数、10進数を16進数など、基数変換には「Math::BaseCalc」モジュールを使用すると楽に行える。Math::BaseCalcモジュールは別途インストールが必要な場合があるので注意。

- Sponsored Link -

サンプル

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

コメント

コメント欄は休止中です。お問い合わせはこちらからどうぞ。ご質問はTwitterにリプを投げてください。

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -