如何根据需要进行编码和解码功能?

时间:2019-03-06 22:06:14

标签: lua decode encode bytecode lua-table

--encode
function strToBytes(str)
 local bytes = { str:byte(1, -1)
 for i = 1, #bytes do
  bytes[i] = bytes[i] + 100
 end
 return table.concat(bytes, ',')
 end

--decode
function bytesToStr(str)
 local function gsub(c)return string.char(c - 100) end
 return str:gsub('(%d+),?', gsub) end

已实现:

str = "hello world"

strbyte = strToBytes(str)

bytestr = bytesToStr(strbyte)

print(strbyte)

输出:

  

204,201,208,208,211,132,219,211,214,208,200

print(bytestr) 输出:

  

“ Hello world”

嗨,我需要在上面改进我的代码。实际上,编码和解码功能可以正常工作,但我需要进行一些更改。

我想使编码函数类似于上面的代码,但是结果如下表所示:

  

{204,201,208,208,211,132,219,211,214,208,200}

然后,与我的第一个解码函数一样,表中的所有字节都应返回“ hello world”。

我希望上面的目的和解释易于理解。预先感谢您的任何帮助和建议。

更新说明:

解释我的目的有点复杂。但我会尽力解释。

我正在尝试使脚本成为编码器。编码功能在编码器脚本端,解码功能在编码的脚本端。因此,我必须在编码字符串之前编写串联解码功能。

为清楚起见,编码器脚本将加载未解码的源代码。

file = io.open(path, "r")
local data = file:read("*l")

问题是,表不能与字符串连接。

local data = encode(str)--the result is byte array
local data = "decode("..data..")"
file:write(data)
file:close()

local data = string.dump(load(data),true,true)

我的第一个目的是隐藏一些重要的字符串,因为string.dump结果不会隐藏所有字符串。 我的第二个目的是使用byteArray创建混淆的代码。

有什么解决办法或建议吗?

已解决

function strToBytes(str)
  local byteArray= { str:byte(1, -1) }
  for i = 1, #byteArray do
  byteArray[i] = byteArray[i] + 100
  encoded = '{' ..table.concat(byteArray, ',') .. '}'
end
  return "load(string.dump(load(bytesToStr("..encoded.."))))()\n"
end

非常感谢您...

1 个答案:

答案 0 :(得分:0)

您的代码与您要查找的代码非常接近。

holder

对于编码,我删除了table.concat,现在只返回byteArray

--encode
function strToBytes(str)
    local byteArray= { str:byte(1, -1) }
    for i = 1, #byteArray do
        byteArray[i] = byteArray[i] + 100
    end
    return '{' .. table.concat(byteArray, ',') .. '}'
 end

对于解码,我使用带有--decode function bytesToStr(byteArray) local output = "" --initialize output variable for _,b in ipairs(byteArray) do --use ipairs to preserve order output = output .. string.char(b - 100) --convert each byte to a char and add to output end return output end 的for循环来遍历每个字节,并将值连接到输出变量中。

ipairs

测试输出:

  

{204,201,208,208,211,132,219,211,214,208,200,133}

     

return bytesToStr({204,201,208,208,211,132,219,211,214,208,200,133})

     

你好,世界!