Нужна помощь в понимании того, как gsub и tonumber используются для кодирования исходного кода lua? - PullRequest
1 голос
/ 17 мая 2019

Я новичок в LUA, но понял, что gsub - это глобальная функция замещения, а tonumber - это функция конвертера.Что я не понимаю, так это то, как две функции используются вместе для создания закодированной строки.

Я уже пробовал читать части PIL (Программирование на Lua) и справочное руководство, но все же немногорастерян.

local L0_0, L1_1
function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
  end))
end
encodes = L0_0
L0_0 = gg
L0_0 = L0_0.toast
L1_1 = "__loading__\226\128\166"
L0_0(L1_1)
L0_0 = encodes
L1_1 = --"The Encoded String"
L0_0 = L0_0(L1_1)
L1_1 = load
L1_1 = L1_1(L0_0)
pcall(L1_1)

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

1 Ответ

1 голос
/ 17 мая 2019

gsub используется для получения 2-значных секций A0_2. Это означает, что строка A0_3 представляет собой двузначное шестнадцатеричное число, но оно не в числовом формате, поэтому мы не можем предварительно вычислить значение. A0_3 как шестнадцатеричное число может быть выведено на основании того, как tonubmer используется.

tonumber из Справочное руководство Lua 5.1 :

Пытается преобразовать свой аргумент в число. Если аргумент уже является числом или строкой, конвертируемой в число, то tonumber возвращает это число; в противном случае возвращается ноль.

Необязательный аргумент указывает основание для интерпретации цифры. Основание может быть любым целым числом от 2 до 36 включительно. В основаниях выше 10 буква «А» (в верхнем или нижнем регистре) представляет 10, «В» представляет 11 и т. Д., Причем «Z» представляет 35. В базе 10 (по умолчанию) число может иметь десятичная часть, а также необязательная экспонентная часть (см. §2.1). В других базах принимаются только целые числа без знака.

То есть tonumber(A0_3, 16) означает, что мы ожидаем, что A0_3 будет основанием 16 (шестнадцатеричное). Как только мы получим числовое значение A0_3, мы сделаем некоторую математику и, наконец, преобразоваем ее в символ.

function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
        return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
      end))
end

Этот блок кода берет строку шестнадцатеричных цифр и преобразует их в символы. tonumber используется для обработки значений.

Вот пример того, как это работает с Hello World:

local str = "Hello World"
local hex_str = ''

for i = 1, #str do
    hex_string = hex_string .. string.format("%x", str:byte(i,i))
end

function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
  end))
end

local encoded = L0_0(hex_str)
print(encoded)

выход

; X__bJbe_W

И возвращает его к исходной строке:

function decode(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 13) % 256)
  end))
end

hex_string = ''
for i = 1, #encoded do
    hex_string = hex_string .. string.format("%x", encoded:byte(i,i))
end

print(decode(hex_string))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...