35 lines
710 B
Julia
35 lines
710 B
Julia
using Printf
|
|
|
|
mutable struct VLQ
|
|
quant::Vector{UInt8}
|
|
end
|
|
|
|
function VLQ(n::T) where T <: Integer
|
|
quant = UInt8.(digits(n, base = 128))
|
|
@inbounds for i in 2:lastindex(quant)
|
|
quant[i] |= 0x80
|
|
end
|
|
VLQ(reverse(quant))
|
|
end
|
|
|
|
import Base.UInt64
|
|
function Base.UInt64(vlq::VLQ)
|
|
quant = reverse(vlq.quant)
|
|
n = popfirst!(quant)
|
|
p = one(UInt64)
|
|
for i in quant
|
|
p *= 0x80
|
|
n += p * (i & 0x7f)
|
|
end
|
|
return n
|
|
end
|
|
|
|
const test = [0x00200000, 0x001fffff, 0x00000000, 0x0000007f,
|
|
0x00000080, 0x00002000, 0x00003fff, 0x00004000,
|
|
0x08000000, 0x0fffffff]
|
|
|
|
for i in test
|
|
vlq = VLQ(i)
|
|
j = UInt(vlq)
|
|
@printf "0x%-8x => [%-25s] => 0x%x\n" i join(("0x" * string(r, base = 16, pad = 2) for r in vlq.quant), ", ") j
|
|
end
|