my %hash; my @chars = (0..9,'A'..'Z','a'..'z',map{chr$_}32..47,58..64,91..96); @hash{@chars} = 0..$#chars; sub encode_base { my ($base,$num) = @_; my ($rem,@ret); while ($num) { push @ret, $chars[($rem = $num % $base)]; $num -= $rem; $num /= $base; } return join '', reverse @ret; } sub decode_base { my ($base, $str) = @_; my $num; $num = $num * $base + $hash{$_} for $str =~ /./g; $num; }