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