web-dev-qa-db-fra.com

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

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

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

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

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

Citant de man perlfunc:

 oct EXPR 
 oct Interprète EXPR comme une chaîne octale et renvoie la valeur 
 correspondante. (Si EXPR arrive à démarrer 
 Avec "0x", l'interprète comme une chaîne hexagonale. Si 
 EXPR commence avec "0b", il est interprété comme une chaîne binaire 
 Les espaces de début sont ignorés dans 
 Dans les trois cas.) 
57
Nathan Fellman

Comme d'habitude, il existe également 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 n'importe quelle longueur et vous pouvez faire d'autres choses intéressantes comme le transfert de bits, etc.

12
innaM

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

Perl -le 'print 0b101'
5

Mais cela ne fonctionne que pour un mot simple.

6
noswonky

Vous pouvez utiliser la méthode eval() pour contourner la restriction Word-bare:

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