sebastian nielsen
sebastian nielsen

Reputation: 505

Perl: Convert string to number (NOT literally!)

I want to convert a string to number. You might read this as I want to convert "5" into 5, but no.

The conversion should be like this:

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

Ergo, treat the input character string as a base^256 number, and convert it accordingly.

In the same way, I want also to be able to convert numbers back into their char representation.

How can I accomplish this in perl?

Upvotes: 2

Views: 1303

Answers (1)

ikegami
ikegami

Reputation: 385546

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

However, that won't handle the numbers for sebastian and SEBASTIAN since they are too large for Perl's native types (64 bits, so 8 bytes). You'd need an library that provides more precision (such as Math::Int128) or one that provides an arbitrary amount of precision (such as Math::BigInt).

Fastest, but limited to 128 bits (16 bytes):

use Math::Int128 qw( net_to_uint128 );

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

or

use Math::Int128 qw( hex_to_uint128 );

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

Require best performance from Math::BigInt:

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

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

Falls back to slower code if GMP is not available:

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

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

Upvotes: 3

Related Questions