在Perl中如何将二进制字符串转换为数字?

37

如何在Perl中将二进制字符串$x_bin="0001001100101"转换为其数值$x_num=613

5个回答

72

我偏爱的方法是:

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

引用自man perlfunc:

    oct EXPR
    oct将EXPR解释为八进制字符串并返回相应的值。(如果EXPR以“0x”开头,则将其解释为十六进制字符串。如果EXPR以“0b”开头,则将其解释为二进制字符串。在这三种情况下,前导空格都将被忽略。)

@edg:在32位平台上这是可以预料的;对我来说,在64位平台上可以工作,尽管有可移植性警告。 - ysth
3
我一直使用pack,但我刚刚测试了pack、oct和Bit::Vector,结果发现Bit::Vector明显更快。在我的系统上,它比Bit::Vector快了1449%,比pack快了316%。 - gpojd

25
sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}

3
我询问的每个工具都告诉我111111111111111111111111111111111翻译成8589934591。你有多确定42949672958589934591是正确的? - innaM
2
这可以通过内置的oct()函数完成,虽然它的命名并不是很好。 - brian d foy

12

像往常一样,这里也应该提到一个优秀的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";

二进制字符串的长度几乎可以任意,而且您还可以执行其他有趣的操作,如位移等。


7
实际上,你只需要在前面加上“0b”,它就会被视为二进制数。
perl -le 'print 0b101'
5

但这只适用于裸词。

0

您可以使用eval()方法来解决裸字限制的问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接