web-dev-qa-db-ja.com

Perlでバイナリ文字列を数値に変換するにはどうすればよいですか?

バイナリ文字列を変換するにはどうすればよいですか$x_bin="0001001100101"をその数値に$x_num=613 Perlで?

29
Nathan Fellman
sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
24
Ed Guiness

私の好みの方法は次のとおりです。

$x_num = oct("0b" . $x_bin);

man perlfuncからの引用:

 oct EXPR 
 oct EXPRを8進文字列として解釈し、
に対応する値を返します。 (EXPRがたまたま
を「0x」で開始した場合、それを16進文字列として解釈します。
 EXPRが「0b」で開始した場合、
バイナリ文字列として解釈されます。 。
 3つのケースすべてで、先頭の空白は無視されます。)
57
Nathan Fellman

いつものように、ここで言及されるべき優れたCPANモジュールもあります: Bit :: Vector

変換は次のようになります。

use Bit::Vector;

my $v = Bit::Vector->new_Bin( 32, '0001001100101' );
print "hex: ", $v->to_Hex(), "\n";
print "dec: ", $v->to_Dec(), "\n";

バイナリ文字列はほぼすべての長さにすることができ、ビットシフトなどの他の巧妙なことを行うことができます。

12
innaM

実際には、前面に「0b」を付けるだけで、2進数として扱われます。

Perl -le 'print 0b101'
5

しかし、これは素の言葉でのみ機能します。

6
noswonky

eval()メソッドを使用して、ベアワードの制限を回避できます。

eval "\$num=0b$str;";
0
hubertf