60 lines
1.2 KiB
Lua
60 lines
1.2 KiB
Lua
|
function pack_u64_dyn(v)
|
||
|
local out = {}
|
||
|
for i = 1, 8 do
|
||
|
local cur = v & 0x7f
|
||
|
v = v >> 7
|
||
|
if v ~= 0 then
|
||
|
out[#out + 1] = string.char(cur | 0x80)
|
||
|
else
|
||
|
out[#out + 1] = string.char(cur)
|
||
|
return table.concat(out)
|
||
|
end
|
||
|
end
|
||
|
if v ~= 0 then
|
||
|
out[#out + 1] = string.char(v)
|
||
|
end
|
||
|
return table.concat(out)
|
||
|
end
|
||
|
|
||
|
function unpack_u64_dyn(str)
|
||
|
local v = 0
|
||
|
local i = 1
|
||
|
local bits = 0
|
||
|
while true do
|
||
|
local b = str:byte(i)
|
||
|
i = i + 1
|
||
|
local has_next = (bits < 56) and (b >> 7) ~= 0
|
||
|
if has_next then
|
||
|
b = b & 0x7f
|
||
|
end
|
||
|
v = v | (b << bits)
|
||
|
if not has_next then
|
||
|
break
|
||
|
end
|
||
|
bits = bits + 7
|
||
|
end
|
||
|
return v
|
||
|
end
|
||
|
|
||
|
function pack_i64_dyn(v)
|
||
|
local neg = (v >> 63)
|
||
|
if v < 0 then
|
||
|
v = (v * -1) & ~(1 << 63)
|
||
|
end
|
||
|
return pack_u64_dyn((neg << 6) | ((v & ~0x3f) << 1) | (v & 0x3f))
|
||
|
end
|
||
|
|
||
|
function unpack_i64_dyn(str)
|
||
|
local v = unpack_u64_dyn(str)
|
||
|
local neg = ((v >> 6) & 1) ~= 0
|
||
|
v = ((v >> 1) & ~0x3f) | (v & 0x3f)
|
||
|
if neg then
|
||
|
if v == 0 then
|
||
|
v = 1 << 63
|
||
|
else
|
||
|
v = v * -1
|
||
|
end
|
||
|
end
|
||
|
return v
|
||
|
end
|