Как сделать, чтобы кодировать и декодировать функции, как я хочу? - PullRequest
1 голос
/ 07 марта 2019
--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

печать (bytestr) Выход:

"Привет, мир"

Привет, мне нужно улучшить мой код выше. На самом деле функции кодирования и декодирования работают нормально, но мне нужно немного изменить.

Я хочу сделать функции кодирования похожими на приведенный выше код, но результаты приведены в следующей таблице:

* * {Тысяча двадцать-один 204.201.208.208.211.132.219.211.214.208.200} * * тысяча двадцать-два

Затем, как и в случае с моими первыми функциями декодирования, все байты внутри таблицы должны быть возвращены в «мир приветствия».

Я надеюсь, что мои цель и объяснение выше легко понять. Заранее благодарим за любую помощь и предложения.

Обновление объяснения:

Немного сложно объяснить, каковы мои цели. Но я постараюсь объяснить как можно лучше.

Я пытаюсь сделать кодировщик скриптов. Функции кодирования находятся на стороне кодированных сценариев, а функция декодирования - на стороне кодированных сценариев. Поэтому я должен написать каскадную функцию декодирования перед закодированной строкой.

Для ясного объяснения, скрипты кодировщика будут загружать исходный код отмены кода.

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 голосов
/ 07 марта 2019

Ваш код был очень близок к тому, что вы искали.

--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

Для кодирования я удалил table.concat и теперь просто возвращаю byteArray

--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, чтобы перебирать каждый байт и объединять значения в выходную переменную.

-- test
str = "hello world!"

strbyte = strToBytes(str)
bytestr = 'return bytesToStr(' .. strbyte .. ')'
strBack = string.dump(load(bytestr),true,true)

print(strbyte)
print(bytestr)
print(load(strBack)())

Тестовый вывод:

{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})

Привет, мир!

...