40 lines
980 B
Lua
40 lines
980 B
Lua
local char, byte, floor = string.char, string.byte, math.floor
|
|
|
|
-- https://gist.github.com/mebens/938502
|
|
local function rshift(x, by)
|
|
return floor(x / 2 ^ by)
|
|
end
|
|
|
|
-- https://stackoverflow.com/a/32387452
|
|
local function bitand(a, b)
|
|
local result = 0
|
|
local bitval = 1
|
|
while a > 0 and b > 0 do
|
|
if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
|
|
result = result + bitval -- set the current bit
|
|
end
|
|
bitval = bitval * 2 -- shift left
|
|
a = floor(a/2) -- shift right
|
|
b = floor(b/2)
|
|
end
|
|
return result
|
|
end
|
|
|
|
function mapsync.encode_uint16(int)
|
|
local a, b = int % 0x100, int / 0x100
|
|
return char(a, b)
|
|
end
|
|
|
|
function mapsync.encode_uint32(v)
|
|
local b1 = bitand(v, 0xFF)
|
|
local b2 = bitand( rshift(v, 8), 0xFF )
|
|
local b3 = bitand( rshift(v, 16), 0xFF )
|
|
local b4 = bitand( rshift(v, 24), 0xFF )
|
|
return char(b1, b2, b3, b4)
|
|
end
|
|
|
|
function mapsync.decode_uint16(str, ofs)
|
|
ofs = ofs or 0
|
|
local a, b = byte(str, ofs + 1, ofs + 2)
|
|
return a + b * 0x100
|
|
end |