54 lines
1.2 KiB
Lua
54 lines
1.2 KiB
Lua
-- 压缩函数
|
|
function rleCompress(str)
|
|
local result = {}
|
|
local i = 1
|
|
while i <= #str do
|
|
local char = str:sub(i, i)
|
|
local count = 1
|
|
while i + count <= #str and str:sub(i + count, i + count) == char do
|
|
count = count + 1
|
|
end
|
|
if count > 2 then
|
|
table.insert(result, ("[%d]%s"):format(count, char))
|
|
else
|
|
table.insert(result, char:rep(count))
|
|
end
|
|
i = i + count
|
|
end
|
|
return table.concat(result)
|
|
end
|
|
|
|
-- 解压函数
|
|
function rleDecompress(str)
|
|
local result = {}
|
|
local i = 1
|
|
while i <= #str do
|
|
if str:sub(i, i) == "[" then
|
|
local j = str:find("]", i)
|
|
local num = tonumber(str:sub(i+1, j-1))
|
|
local char = str:sub(j+1, j+1)
|
|
table.insert(result, char:rep(num))
|
|
i = j + 2
|
|
else
|
|
table.insert(result, str:sub(i, i))
|
|
i = i + 1
|
|
end
|
|
end
|
|
return table.concat(result)
|
|
end
|
|
|
|
-- 测试
|
|
file = fs.open("1.bimg","r")
|
|
original = file.readAll()
|
|
file.close()
|
|
|
|
|
|
local compressed = rleCompress(original)
|
|
print("原始:", original)
|
|
print("压缩:", compressed)
|
|
print("解压:", rleDecompress(compressed))
|
|
file = fs.open("12.bimg","w")
|
|
file.write(compressed)
|
|
file.close()
|
|
|