sub vlq_encode ($number is copy) {
my @vlq = (127 +& $number).fmt("%02X");
$number +>= 7;
while ($number) {
@vlq.push: (128 +| (127 +& $number)).fmt("%02X");
$number +>= 7;
}
@vlq.reverse.join: ':';
}
sub vlq_decode ($string) {
sum $string.split(':').reverse.map: {(:16($_) +& 127) +< (7 × $++)}
}
#test encoding and decoding
for (
0, 0xa, 123, 254, 255, 256,
257, 65534, 65535, 65536, 65537, 0x1fffff,
0x200000
) -> $testcase {
printf "%8s %12s %8s\n", $testcase,
my $encoded = vlq_encode($testcase),
vlq_decode($encoded);
}