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

Perl: Convert string to number (NOT literally!)

我想将字符串转换为数字。您可能会读到这篇文章,因为我想将“5”转换为 5,但是不行。

转换应该是这样的:

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

因此,将输入的字符串视为base^256的数字,并进行相应的转换。

以同样的方式,我也希望能够将数字转换回它们的字符表示形式。

如何在 perl 中完成此操作?

my $n = unpack("Q>", substr(("[=10=]"x8) . $s, -8));

然而,这不会处理 sebastianSEBASTIAN 的数字,因为它们对于 Perl 的本地类型(64 位,所以 8 个字节)来说太大了。您需要一个提供更高精度的库(例如 Math::Int128) or one that provides an arbitrary amount of precision (such as Math::BigInt)。

最快,但限于 128 位(16 字节):

use Math::Int128 qw( net_to_uint128 );

my $n = net_to_uint128(substr(("[=11=]"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));