end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

perlで基数変換(10進数16進数 他)するには?

10進数->16進数にsprintf("%04X",$x)、16進数->10進数にhex($x)

perlで基数変換するには、いくつか方法がありますが、私の場合、10進数->16進数にはsprintf("%04X",$dec_val)、16進数->10進数にはhex($hex_val)を使用しています。

#!c:/Perl/bin/perl
use strict;
use warnings;

my $dec_val = 1999;
#$dec_val = 0x07cf という書き方でもOK
my $hex_val = sprintf("%04X",$dec_val);
print "10進:$dec_val -> 16進:$hex_val (16進数 & 4桁 & 0前置)\n";

my $hex_val2 = "07cf";
my $dec_val2 = hex($hex_val2);
print "16進:$hex_val2 (16進数 & 4桁 & 0前置) -> 10進:$dec_val2\n";
$ ./foo.pl 
10進:1999 -> 16進:07CF (16進数 & 4桁 & 0前置)
16進:07cf (16進数 & 4桁 & 0前置) -> 10進:1999

※sprint()やhex()では前置きした文字列も問題なく変換できます
※10進->2進数にはsprintf("%b",$x)、10進->8進数にはsprintf("%o",$x)

pack(),unpack()もあるらしい

pack(),unpack()による基数変換もありますが、読みづらい気がするので、私は使用していません。

http://www.penlabo.net/perl/howto/perl%E3%81%A710%E9%80%B2%E6%95%B0%E3%82%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B

Math::BaseCalcもあるらしい

これまで使用したことはありませんが、更にMath::BaseCalcという基数変換を行うmoduleもあるようです。

http://search.cpan.org/perldoc?Math::BaseCalc


使い方も簡単のようですが、10<->16進数の基数変換程度であれば、sprintf("%04X",$x), hex($x)でいいかな。