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

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top