我需要将长十进制数转换为14245138929982432 in为十六进制值,其值为329BE0DDB29BE0。
但是当我尝试使用下面的代码时,我得到的结果为FFFFFFFF。
$l_KeyExpected_UL=14245138929982432;
$hexadeci = sprintf '%X', $l_KeyExpected_UL;
print $hexadeci."\n";\
可以请任何人帮忙。
答案 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构建将显示以下内容:
$ perl -V:ivsize
ivsize='8';
如果这是你所拥有的,你可以简单地使用
my $i = 14245138929982432;
my $hex = sprintf('%X', $i);
该数字至少需要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。