我想将字符串转换为数字。您可能会读到此内容,因为我想将“5”转换为 5,但不行。
转换应该是这样的:
"aa" -> 24929
"55" -> 13621
"sebastian" -> 2128681077170648998254
"SEBASTIAN" -> 1536070381281124893006
\xFF\xFF -> 65536
因此,将输入字符串视为 base^256 数字,并进行相应转换。
以同样的方式,我也希望能够将数字转换回其字符表示形式。
如何在 Perl 中完成此任务?
最佳答案
my $n = unpack("Q>", substr(("\0"x8) . $s, -8));
但是,这不会处理 sebastian
和 SEBASTIAN
的数字,因为它们对于 Perl 的 native 类型来说太大(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));
关于string - Perl:将字符串转换为数字(不是字面上的!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40409438/