2012-05-11 5 views
2

J'ai une chaîne contient 64 symboles binaires.perl. convertir un nombre binaire 64 bits en nombre décimal

J'ai besoin de le convertir en nombre décimal. Comment puis-je le faire en perl?

sub bin2dec { 
    return unpack("N", pack("B64", substr("0" x 64 . shift, -64))); 
} 

ne fonctionne pas. il convertit juste le premier 32 bits.

+0

Probablement la première chose à considérer est de savoir si votre perl est construit avec un support 64 bits, mais je ne suis pas complètement sûr si cela dépend à 100% de cela. – ArtM

Répondre

8

De l'docs,

N An unsigned long (32-bit) in "network" (big-endian) order. 

L'équivalent 64 bits serait "Q>".

q A signed quad (64-bit) value. 
Q An unsigned quad value. 
    (Quads are available only if your system supports 64-bit 
    integer values _and_ if Perl has been compiled to support 
    those. Raises an exception otherwise.) 

> sSiIlLqQ Force big-endian byte-order on the type. 
    jJfFdDpP (The "big end" touches the construct.) 

vous pouvez donc utiliser les éléments suivants:

unpack("Q>", pack("B64", substr("0" x 64 . shift, -64))) 

Cela dit, le est inutilement compliqué ci-dessus. Celui qui était codé qui était sans doute pas au courant de la capacité de oct pour analyser les nombres binaires parce que le ci-dessus peut être réduite à

oct("0b" . shift) 

Mais que faites-vous si vous ne disposez pas d'une version 64 bits de Perl? Vous devez utiliser une sorte d'objet qui surcharge les opérations mathématiques. Vous pouvez utiliser Math::BigInt, mais je suppose que ce ne sera pas aussi rapide que Math::Int64.

use Math::Int64 qw(string_to_int64); 
string_to_int64(shift, 2) 

Par exemple,

$ perl -MMath::Int64=string_to_int64 -E'say string_to_int64(shift, 2);' \ 
    100000000000000000000000000000000 
4294967296 
4
use Math::BigInt; 
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001'); 
print $b; 

Juste l'idée, pas un code équivalent à votre sous-programme.
Le nombre binaire est ici arbitraire. Utilise le tien.

+0

+1 (j'aime ça!) Ou simplement "print Math :: BigInt-> new ('0b'. $ BinaryStr);' –

Questions connexes