Comment convertir une chaîne binaire en nombre en Perl?

Comment puis-je convertir la chaîne binaire $x_bin="0001001100101" pour sa valeur numérique $x_num=613 en Perl?

29
demandé sur Nathan Fellman 2009-01-27 17:43:29

5 réponses

sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
23
répondu Ed Guiness 2012-07-08 12:44:00

Mon manière préférée est:

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

citation de man perlfunc:

    oct EXPR
    oct     Interprets EXPR as an octal string and returns the
            corresponding value. (If EXPR happens to start
            off with "0x", interprets it as a hex string. If
            EXPR starts off with "0b", it is interpreted as a
            binary string. Leading whitespace is ignored in
            all three cases.)
57
répondu Nathan Fellman 2017-06-22 00:43:33

comme d'habitude, il y a aussi un excellent module CPAN qui devrait être mentionné ici: Bit:: Vector.

La transformation ressemblerait à quelque chose comme ceci:

use Bit::Vector;

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

les chaînes binaires peuvent être de presque n'importe quelle longueur et vous pouvez faire d'autres choses soignées comme le bit-shifting, etc.

12
répondu innaM 2009-01-27 16:39:29

en fait, vous pouvez simplement coller "0b" sur le devant et il est traité comme un nombre binaire.

perl -le 'print 0b101'
5

mais cela ne fonctionne que pour une simple parole.

6
répondu noswonky 2009-07-30 14:13:29

Vous pouvez utiliser le eval() méthode pour contourner la restriction des mots nus:

eval "$num=0b$str;";
0
répondu hubertf 2018-01-30 22:44:13