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, но он лажает точно так же
Форум —
Development


