我想将字符串转换为数字。你可能会读到这个,因为我想转换" 5"到5,但没有。
转换应该是这样的:
"aa" -> 24929
"55" -> 13621
"sebastian" -> 2128681077170648998254
"SEBASTIAN" -> 1536070381281124893006
\xFF\xFF -> 65536
Ergo,将输入字符串视为基数^ 256数字,并相应地进行转换。
同样,我也希望能够将数字转换回他们的char表示。
如何在perl中完成此操作?
答案 0 :(得分:3)
my $n = unpack("Q>", substr(("\0"x8) . $s, -8));
但是,它不会处理sebastian
和SEBASTIAN
的数字,因为它们对于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));