我是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)
我删除了放置注释的编码字符串,因为注释持续了多长时间。如果需要,我也可以上传编码后的字符串。
答案 0 :(得分:1)
gsub
用于获取A0_2
的2位数部分。这意味着字符串A0_3
是2位数的十六进制数字,但不是数字格式,因此我们无法对该值进行数学运算。可以根据A0_3
的使用方式推断出tonubmer
是十六进制数字。
tonumber
来自Lua 5.1 Reference Manual:
尝试将其参数转换为数字。如果参数已经是数字或可转换为数字的字符串,则tonumber返回此数字;否则,返回nil。
可选参数指定用于解释数字的基数。基数可以是2到36之间(包括2和36)的任何整数。在10以上的基数中,字母“ A”(大写或小写)代表10,“ B”代表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
此代码块使用十六进制数字字符串并将其转换为char。 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))