Variable-length quantity: Difference between revisions

m
→‎{{header|Raku}}: Modernize a bit
m (→‎{{header|Raku}}: Modernize a bit)
Line 1,692:
=={{header|Raku}}==
(formerly Perl 6)
vlq_encode() returns a string of characters whose ordinals are the encoded octets. vlq_decode() takes a string and returns a decimal number.
<syntaxhighlight lang="raku" line>sub vlq_encode ($number is copy) {
my $string@vlq = ''(127 +& $number).fmt("%02X");
my $t = 0x7F +& $number;
$number +>= 7;
$string = $t.chr ~ $string;
while ($number) {
$t@vlq.push: =(128 +| 0x7F(127 +& $number)).fmt("%02X");
$string = (0x80 +| $t).chr ~ $string;
$number +>= 7;
}
@vlq.reverse.join: ':';
return $string;
}
 
sub vlq_decode ($string is copy) {
sum $string.split(':').reverse.map: {(:16($_) +& 127) +< (7 × $++)}
my $number = '0b';
for $string.ords -> $oct {
$number ~= ($oct +& 0x7F).fmt("%07b");
}
return :2($number);
}
 
Line 1,720 ⟶ 1,713:
0x200000
) -> $testcase {
my $encoded = vlq_encode($testcase);
printf "%8s %12s %8s\n", $testcase,
my $encoded = vlq_encode($testcase);,
( join ':', $encoded.ords>>.fmt("%02X") ),
vlq_decode($encoded);
}</syntaxhighlight>
10,327

edits