Эффективный pre-perl-5.10 эквивалент упаковки ("Q>")

Обновление: Сальва правильно указывает, что я ошибался насчет введения шаблона пакета "Q". Это модификатор ">", который не возвращается к 5.8.

Perl 5.10 представил модификатор pack() ">", который, для моего случая использования с "Q", упаковывает значение без знака в квадрате (64 бита) с прямым порядком байтов.

Теперь я ищу эффективный эквивалент для

pack("Q>2", @ints)

где @ints содержит два 64-битных целых числа без знака. "Q>2" означает "упаковать два беззнаковых квадра в порядке байтов с прямым порядком байтов". Очевидно, я хочу этого, потому что я (по крайней мере временно) привязан к Perl до 5.10.

Обновление 2: На самом деле, если подумать дальше, нужно сделать что-то простое:

pack("N4", $ints[0] >> 32, $ints[0], $ints[1] >> 32, $ints[1])

Похоже, работает на моем 64-битном Linux x86-64. Любая причина, почему это может не совпадать с pack("Q>2", @ints)? Какие-то вопросы, связанные с платформой?

Что обратного (т.е. эквивалентно распаковке ("Q>2", @ints))?

1 ответ

Решение

Q шаблон был введен в Perl 5.6. Ваша настоящая проблема может заключаться в том, что вы пытаетесь использовать его в Perl, скомпилированном без поддержки 64-битной версии.

В любом случае, вы можете использовать Math:: Int64.

Обновление, пример:

use Math::Int64 qw(int64_to_native);
my $packed = join '', map int64_to_native($_), @ints;

Другой вариант, если вы поддерживаете 64-битный Perl Q но нет Q>, это переупорядочить байты самостоятельно:

pack 'C*', reverse unpack 'C*', pack 'Q', $int;
Другие вопросы по тегам