Perl:将字符串转换为数字(不是字面意思!)

时间:2016-11-03 19:08:34

标签: string perl numbers base

我想将字符串转换为数字。你可能会读到这个,因为我想转换" 5"到5,但没有。

转换应该是这样的:

"aa" -> 24929
"55" -> 13621
"sebastian" -> 2128681077170648998254
"SEBASTIAN" -> 1536070381281124893006
\xFF\xFF -> 65536

Ergo,将输入字符串视为基数^ 256数字,并相应地进行转换。

同样,我也希望能够将数字转换回他们的char表示。

如何在perl中完成此操作?

1 个答案:

答案 0 :(得分:3)

my $n = unpack("Q>", substr(("\0"x8) . $s, -8));

但是,它不会处理sebastianSEBASTIAN的数字,因为它们对于Perl的本机类型来说太大(64位,所以8个字节)。您需要一个提供更高精度的库(例如Math::Int128)或一个提供任意精度的库(例如Math::BigInt)。

速度最快,但限制为128位(16字节):

use Math::Int128 qw( net_to_uint128 );

my $n = net_to_uint128(substr(("\0"x16) . $s, -16));

use Math::Int128 qw( hex_to_uint128 );

my $n = hex_to_uint128(unpack('H*', $s));

需要Math :: BigInt的最佳性能:

use Math::BigInt only => 'GMP';

my $n = Math::BigInt->from_hex(unpack('H*', $s));

如果GMP不可用,则回退到较慢的代码:

use Math::BigInt try => 'GMP';

my $n = Math::BigInt->from_hex(unpack('H*', $s));