是否有任何函数可以将长十进制数转换为十六进制数?

时间:2016-05-17 08:59:13

标签: perl

我需要将长十进制数转换为14245138929982432 in为十六进制值,其值为329BE0DDB29BE0。

但是当我尝试使用下面的代码时,我得到的结果为FFFFFFFF。

$l_KeyExpected_UL=14245138929982432;
$hexadeci = sprintf '%X', $l_KeyExpected_UL;
print $hexadeci."\n";\

可以请任何人帮忙。

2 个答案:

答案 0 :(得分:7)

您可以使用Math::BigInt模块,该模块执行bigint pragma背后的所有繁重工作

您无法使用sprintf下的bigint将大小数转换为十六进制,因为其转换不会重载,但Math::BigInt个对象有一个as_hex方法返回数字表示为十六进制字符串,前缀为0x

此程序将转换包装在子例程bigint_to_hex中,该子例程删除0x前缀并将小写更改为大写

现在遇到无法处理64位值的Perl安装是不寻常的。但是这个方法适用于任何十进制字符串,正如我通过转换1.2E40的值以及问题中的值所证明的那样

将大整数作为字符串传递至关重要,因为如果数字文字超过普通整数的宽度,它们将被编译器转换为浮点数。我的程序还打印相同的1.2E40值的十六进制等效值,不带引号,以便您可以看到差异

use strict;
use warnings 'all';
use feature 'say';

use Math::BigInt;


my $l_KeyExpected_UL = '14245138929982432';

say bigint_to_hex($l_KeyExpected_UL);
say bigint_to_hex('12345678901234567890123456789012345678901');
say bigint_to_hex(12345678901234567890123456789012345678901);
say bigint_to_hex(1.2E40);

sub bigint_to_hex {
    my $hex = Math::BigInt->new(shift)->as_hex;
    $hex =~ s/^0x//;
    uc $hex;
}

输出

329BE0DDB29BE0
2447DB449988978536BF5BBBE40E766C35
2447DB449988B214BEA48F651CA8000000
2343CBEEEA6F2C193478C00E0000000000

答案 1 :(得分:0)

如果您使用64位整数构建Perl

使用64位整数的Perl构建将显示以下内容:

$ perl -V:ivsize
ivsize='8';

如果这是你所拥有的,你可以简单地使用

my $i = 14245138929982432;
my $hex = sprintf('%X', $i);

如果你有一个可能没有64位整数的Perl版本

该数字至少需要56位才能存储。

Math::Int64允许您访问本机64位整数。

use Math::Int64 qw( uint64 int64_to_hex );

# Note that the number is provided as a string!
my $i = uint64('14245138929982432');
my $hex = int64_to_hex($i);

你也可以使用任意精度库,例如Math::BigInt,但它必然会更慢。如果您要使用64位整数进行一些数字运算,那么您肯定需要Math :: Int64而不是Math :: BigInt。