my @packCharacters = ('0'..'9', 'A'..'Z'); my %unpackCharacters; my $decimalValue = 0; map { $unpackCharacters{$_} = $decimalValue++ } @packCharacters; sub packLongId { my $id = shift; my $base = scalar @packCharacters; my $packedId = ''; for ( my $currentValue = $id; $currentValue > 0; $currentValue = int($currentValue / $base) ) { $packedId .= $packCharacters[ $currentValue % $base ]; } return join "", reverse split //, $packedId; } sub unpackLongId { my $packedId = shift; my $base = scalar @packCharacters; my $id = 0; my $currentPower = 1; map { $id += $unpackCharacters{$_} * $currentPower; $currentPower *= $base; } reverse split //, $packedId; return $id; } Переводит, вроде, нормально, но на больших числах начинает лажать. packLong(11764992501273288845) => 2HDUTRXH5G84T unpackLong("2HDUTRXH5G84T") => 11764992501273290285 ??? Накопал в цпане Math::BaseCalc, но он лажает точно так же