Эффективный pre-perl-5.10 эквивалент пакета («Q>») - PullRequest
3 голосов
/ 15 марта 2012

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

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

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

pack("Q>2", @ints)

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

Update2: На самом деле, при дальнейшем рассмотрении, что-то простое, как должно сделать следующее:

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

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

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

1 Ответ

5 голосов
/ 15 марта 2012

Шаблон 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;
...