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);
|
|||
|
|
}
|