string - Perl:将字符串转换为数字(不是字面上的!)

标签 string perl numbers radix

我想将字符串转换为数字。您可能会读到此内容,因为我想将“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));

但是,这不会处理 sebastianSEBASTIAN 的数字,因为它们对于 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/

相关文章:

perl - 在一段时间内readdir()产生的 “0”如何不为假?

rust - 我什么时候应该使用 usize vs i32, f32?

java - 将仅包含值 0 和 1 的整数类型数组转换为字符串,该字符串应该是 java 中字符串形式的数组值的简单序列

c# - 从右到左语言中的正则表达式模式匹配

c - 字符串引用是否重复?

javascript - 尝试了解如何使用 parseFloat 将字符串转换为数字

java - 如何对两个 Number 实例使用模?

c - 将 printf 与非空终止字符串一起使用

bash - bash 中的持续时间总和

perl - DPAN 创建本地 CPAN