バイナリ文字列を変換するにはどうすればよいですか$x_bin="0001001100101"
をその数値に$x_num=613
Perlで?
sub bin2dec {
return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
私の好みの方法は次のとおりです。
$x_num = oct("0b" . $x_bin);
man perlfunc
からの引用:
oct EXPR oct EXPRを8進文字列として解釈し、 に対応する値を返します。 (EXPRがたまたま を「0x」で開始した場合、それを16進文字列として解釈します。 EXPRが「0b」で開始した場合、 バイナリ文字列として解釈されます。 。 3つのケースすべてで、先頭の空白は無視されます。)
いつものように、ここで言及されるべき優れた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";
バイナリ文字列はほぼすべての長さにすることができ、ビットシフトなどの他の巧妙なことを行うことができます。
実際には、前面に「0b」を付けるだけで、2進数として扱われます。
Perl -le 'print 0b101'
5
しかし、これは素の言葉でのみ機能します。
eval()
メソッドを使用して、ベアワードの制限を回避できます。
eval "\$num=0b$str;";