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
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