数値変換のまとめ

10->16進数、16->10進数とか良く忘れるのでまとめときまする。

それっぽいモジュールでも作ってみた。

CPANにこんなの無いかなぁ?

package Pack;
use strict;

# 16進数→バイナリ
sub p16toBinary {
    my $class = shift;
    pack('H*', join '' , @_);
}

# 16進数→10進数
sub p16to10 {
    my $class = shift;
    join( '' , map hex , @_);
}

# 16進数→8進数
sub p16to8 {
    my $class = shift;
    sprintf('%o' x @_, map hex , @_);
}

# 16進数→2進数(昇ビット順)
sub p16to2Asc {
    unpack('b*' , shift->p16toBinary(@_) );
}

# 16進数→2進数(降ビット順)
sub p16to2Desc {
    unpack('B*' , shift->p16toBinary(@_) );
}

# 10進数→バイナリ
sub p10toBinary {
    my $class = shift;
    pack('H*', join '' , map sprintf("%x",$_) , @_ );
}

# 10進数→16進数
sub p10to16 {
    my $class = shift;
    sprintf('%x' x @_ , @_); 
}

# 10進数→8進数
sub p10to8 {
    my $class = shift;
    sprintf('%o' x @_ , @_);
}

# 10進数→2進数(昇ビット順)
sub p10to2Asc {
    my $class = shift;
    unpack('b*' , pack("C*",@_) );
}

# 10進数→2進数(降ビット順)
sub p10to2Desc {
    my $class = shift;
    unpack('B*' , pack("C*",@_) );
}

# 8進数→バイナリ
sub p8toBinary {
    shift->p10toBinary( map oct , @_ );
}

# 8進数→16進数
sub p8to16 {
    shift->p10to16( map oct , @_ );
}

# 8進数→10進数
sub p8to10 {
    my $class = shift;
    join( '' , map oct , @_);
}

# 8進数→2進数(昇ビット順)
sub p8to2Asc {
    unpack('b*' , shift->p10toBinary( map oct , @_ ) );
}

# 8進数→2進数(降ビット順)
sub p8to2Desc {
    unpack('B*' , shift->p10toBinary( map oct , @_ ) );
}

# 2進数→バイナリ
sub p2toBinary {
    my $class = shift;
    pack("B*", join '' , @_);
}

# 2進数→16進数
sub p2to16 {
    unpack("H*", shift->p2toBinary(@_) );
}

# 2進数→10進数
sub p2to10 {
    unpack("C*", shift->p2toBinary(@_) );
}

# 2進数→8進数
sub p2to8 {
    my $class = shift;
    $class->p10to8( $class->p2to10(@_) );
}

# バイナリ→16進数
sub pBinaryto16 {
    my $class = shift;
    unpack("H*", join '' , @_);
}

# バイナリ→10進数
sub pBinaryto10 {
    my $class = shift;
    unpack("C*", join '' , @_);
}

# バイナリ→8進数
sub pBinaryto8 {
    my $class = shift;
    sprintf('%o' x @_ , $class->pBinaryto10(@_) );
}

# バイナリ→2進数(昇ビット順)
sub pBinaryto2Asc {
    my $class = shift;
    unpack("b*", join '' , @_ );
}

# バイナリ→2進数(降ビット順)
sub pBinaryto2Desc {
    my $class = shift;
    unpack("B*", join '' , @_ );
}

2進数→8進数が一番ややこしいよね。

2進数を一旦バイナリに変換してバイナリから10進数に変換して10進数から8進数に変換してます。
んー一発でやる方法ないのかなぁ・・・。
いや、まぁそもそも2進数→8進数にするようなケースなんて殆ど無いか。