42 lines
914 B
Elixir
42 lines
914 B
Elixir
function vlq_encode(integer n)
|
|
sequence s
|
|
s = {}
|
|
while n > 0 do
|
|
s = prepend(s, #80 * (length(s) > 0) + and_bits(n, #7F))
|
|
n = floor(n / #80)
|
|
end while
|
|
if length(s) = 0 then
|
|
s = {0}
|
|
end if
|
|
return s
|
|
end function
|
|
|
|
function vlq_decode(sequence s)
|
|
integer n
|
|
n = 0
|
|
for i = 1 to length(s) do
|
|
n *= #80
|
|
n += and_bits(s[i], #7F)
|
|
if not and_bits(s[i], #80) then
|
|
exit
|
|
end if
|
|
end for
|
|
return n
|
|
end function
|
|
|
|
function svlg(sequence s)
|
|
sequence out
|
|
out = ""
|
|
for i = 1 to length(s) do
|
|
out &= sprintf("#%02x:", {s[i]})
|
|
end for
|
|
return out[1..$-1]
|
|
end function
|
|
|
|
constant testNumbers = { #200000, #1FFFFF, 1, 127, 128 }
|
|
sequence s
|
|
for i = 1 to length(testNumbers) do
|
|
s = vlq_encode(testNumbers[i])
|
|
printf(1, "#%02x -> %s -> #%02x\n", {testNumbers[i], svlg(s), vlq_decode(s)})
|
|
end for
|