Работа с 64-битными int и гексами в 32-битном Perl - PullRequest
3 голосов
/ 07 сентября 2011

Я хочу написать Perl-скрипт для разбора текстовых файлов с большим количеством 64-битных целых. Все целые числа записаны в шестнадцатеричном виде.

Мне нужно

  • Чтение гекса из ввода
  • Сравните 64-битные значения (<, =, >)
  • Вычитать 64-битные целые числа
  • Вывод 64-битных гексов

Мне нужно использовать 32-битный Perl, и я не могу использовать какой-либо CPAN / внешний модуль (скрипт должен быть переносимым).

PS мой perl 5.8 (и это минимальная версия, которая будет использоваться для скрипта)

Ошибки PPS Bignum / Bigint:

$ perl -e 'use bignum; $_=hex("0x0000123412345678")'
Integer overflow in hexadecimal number at -e line 1.

$ perl -e 'use bigint; $_=hex("0x0000123412345678")'
Integer overflow in hexadecimal number at -e line 1.

PPPS: нет from_hex здесь.

$ perl -e 'use Math::BigInt; $_=Math::BigInt->from_hex("0x0000123412345678");'
Can't locate object method "from_hex" via package "Math::BigInt" at -e line 1.

и нет qw/hex/:

$ perl -e 'use bigint qw/hex/; $_=hex("0x0000123412345678")'
unknown option hex at /usr/lib/perl5/5.8/bigint.pm line...

PPPPS: но new () работает:

$ perl -e 'use Math::BigInt; $_=Math::BigInt->new("0x0000123412345678"); print  $_->as_hex(),"\n";'
0x123412345678

Ответы [ 2 ]

10 голосов
/ 07 сентября 2011

Основная прагма bigint позволит вам прозрачно работать с целыми числами, большими, чем ваша система может поддерживать. В базовой библиотеке Math :: BigInt есть связанные функции для преобразования из и в шестнадцатеричное представление.

4 голосов
/ 07 сентября 2011

Math :: Int64 предоставляет доступ к собственным 64-разрядным числам со знаком и без знака.Это, безусловно, быстрее, чем возможная альтернатива Math :: BigInt .

. Имеет процедуры преобразования в шестнадцатеричные числа, перегружает операторы сравнения и арифметики, поэтому может выполнять все, что вы просили.

use Math::Int64 qw( hex_to_uint64 uint64_to_hex );
my $n1 = hex_to_uint64("200000000");
my $n2 = hex_to_uint64("300000000");
printf("n1 is %s equal to n2\n",     $n1 == $n2 ? "" : "not");
printf("n1 is %s less than n2\n",    $n1 <  $n2 ? "" : "not");
printf("n1 is %s greater than n2\n", $n1 >  $n2 ? "" : "not");
printf("0x%016s", uint64_to_hex($n2 - $n1));

Вывод:

n1 is not equal to n2
n1 is less than n2
n1 is not greater than n2
0x0000000100000000

Использование CPAN или его отсутствие не влияет на переносимость скрипта.

...