#!/usr/bin/perl -w # varint.pl - Don Yang (uguu.org) # # 04/26/08 use strict; # Encode number to variable length string sub Encode($) { my ($number) = @_; my $str = chr(35 + ($number % 57)); for($number = int($number / 57); $number > 0; $number = int($number / 19)) { $str = chr(93 + ($number % 19)) . $str; } return $str; } # Decode number from variable length string sub Decode($) { my @code = unpack 'C*', $_[0]; my $number = 0; for(my $i = 0; $i < $#code; $i++) { $number = $number * 19 + $code[$i] - 93; } $number = $number * 57 + $code[$#code] - 35; return $number; } # Test conversion for(my $i = 0; $i < 100000; $i++) { my $j = Decode(Encode($i)); die if $i != $j; }