在32位perl中使用64位整数和十六进制

时间:2011-09-06 20:48:14

标签: perl 64-bit hex

我想编写一个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 个答案:

答案 0 :(得分:10)

核心编译指示bigint将允许您透明地处理大于系统可支持的整数。 Math::BigInt核心库中有相关的函数可以转换为十六进制表示。

答案 1 :(得分:4)

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或缺少CPAN不会影响脚本的可移植性。