Эффективный 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;