Equivalente eficiente pre-perl-5.10 del paquete ("Q>")
Pregunta
Actualizar:Salva señala correctamente que me equivoqué en la introducción de la plantilla del pack "Q".Es el modificador ">" que no vuelve a 5.8.
Perl 5.10 introdujo el modificador pack() ">", que, para mi caso de uso con "Q", incluye un valor cuádruple sin signo (64 bits) en gran endian.
Ahora, estoy buscando un equivalente eficiente para
pack("Q>2", @ints)
donde @ints contiene dos entradas sin firmar de 64 bits."Q>2" significa "empaquetar dos quads sin firmar en orden de bytes big-endian".Obviamente, quiero esto porque estoy (al menos temporalmente) atado a un Perl anterior a 5.10.
Actualización 2:En realidad, reflexionando más a fondo, algo tan simple como lo siguiente debería funcionar:
pack("N4", $ints[0] >> 32, $ints[0], $ints[1] >> 32, $ints[1])
Parece funcionar en mi Linux x86-64 de 64 bits.¿Alguna razón por la que esto podría no ser exactamente igual que pack("Q>2", @ints)
?¿Algún asunto específico de la plataforma?
¿Qué es lo contrario (es decir,equivalente a desempaquetar("Q>2", @ints))?
Solución
El Q
El patrón se introdujo en Perl 5.6.Su verdadero problema puede ser que esté intentando usarlo en un Perl compilado sin soporte de 64 bits.
De todos modos, puedes usar Matemáticas::Int64.
Actualizar, un ejemplo:
use Math::Int64 qw(int64_to_native);
my $packed = join '', map int64_to_native($_), @ints;
Otra opción, si tiene un soporte Perl de 64 bits Q
pero no Q>
, es reordenar los bytes usted mismo:
pack 'C*', reverse unpack 'C*', pack 'Q', $int;