25 lines
606 B
Raku
25 lines
606 B
Raku
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);
|
||
}
|