Stand/tunables/u64_dyn.lua
2024-10-16 11:20:42 +08:00

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