【语法】
一、隐蔽陷阱
存档串里连续重复段很长,手写逐字符比较压短时,循环边界少走一步,末段重复没被计入,压缩结果时对时错。
二、底层原理
行程编码把连续相同字符合并成"字符+次数":aaabccccdd 写成 a3b1c4d2。扫描指针一次走完,段内累加次数,字符切换时输出上一段;循环多走一步到串尾,末段自然收口。解压按字符与次数还原,长度严格可逆。
三、正确代码
基础写法(压缩):
local function pack(s)
local out, run = {}, 1
for i = 2, #s + 1 do
local cur = s:sub(i, i)
if cur ~= s:sub(i - 1, i - 1) then
out[#out + 1] = s:sub(i - 1, i - 1) .. run
run = 0
end
run = run + 1
end
return table.concat(out)
end
进阶写法(按字符与次数解压还原):
local function unpackRle(s)
local out = {}
for c, n in s:gmatch("(%a)(%d+)") do
out[#out + 1] = c:rep(tonumber(n))
end
return table.concat(out)
end
local p = getplayerbyname("arch01")
local packed = pack("aaabccccdd")
sendmsg(p, 1, packed .. " 还原 " .. unpackRle(packed))
-- 输出 a3b1c4d2 还原 aaabccccdd
四、引擎验证
10 字符样例压成 8 字符并逐字节还原一致;重复率更高的 60 字符轨迹串压到 18 字符,还原比对相同。
五、FAQ
问:什么数据适合?
答:连续重复多的存档段与轨迹串收益高,随机串反而变长。
问:次数超过 9 怎么办?
答:%d+ 支持多位数,单段次数不受一位限制。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 隐蔽的坑:折叠列表收起分组时只把子项 setVisible(false),占位还留在原地,列表下半截…
【语法】 一、机制原理 一行代码拆解:a, b = b, a % b。最大公约数的辗转相除法:两数相除取余数,余数再与除数继…
【游戏】 一、规则机制 线上事故:聊天里 @ 了某人,消息混在普通流水里,对方根本没注意,集合迟到的锅全甩给没提醒。点名提醒…
【游戏】 一、规则机制 一行定骨架:text = LANG[cur][key] or LANG.zh[key]。多语言文案的…
【语法】 一、机制原理 抛个坑:模板"$(name),您的$(item)已到账"这种带命名槽位的文案怎么填值?string.…
【游戏】 一、规则机制 抛个坑:横屏竖屏一切界面,控件坐标全按竖屏摆,一旋转错位满屏——适配该怎么做?两条策略配合:界面元素…