【发布时间】:2025-11-17 21:50:02
【问题描述】:
我正在移植一个替换密码函数,它可以解扰(解码)Lua 中的给定字符串。
function unscramble(str)
local res = ""
local dtable = "7,Jsg(E<\fIvBT@3_{|k\005Ww0#P\000\015\031rmG]~\030}\"xut\017X\004\016\006`+\t\001)l*\aq%ULh.6 \b\025;OQ\003\\\002\029ZN\0235\014[$e1K\027d\v4Y!^\rVi8fMc'>b:RjHA-CznS\021\028a\026\022F9o\n\018\019?yp\020=/&D2\024"
for i = 1, #str do
local b = str:byte(i)
if b > 0 and b <= 127 then
res = res .. string.char(dtable:byte(b))
else
res = res .. string.char(b)
end
end
return res
end
这个想法似乎很简单 - 用 dtable 变量中的对应位置替换所有 ASCII 符号。
我用https://www.tutorialspoint.com/execute_lua_online.php来验证
print(unscramble("dM22r"))
Hello
我在 Python 中的最佳表现是
def unscramble(str):
res = ''
dtable = b"7,Jsg(E<\fIvBT@3_{|k\005Ww0#P\000\015\031rmG]~\030}\"xut\017X\004\016\006`+\t\001)l*\aq%ULh.6 \b\025;OQ\003\\\002\029ZN\0235\014[$e1K\027d\v4Y!^\rVi8fMc'>b:RjHA-CznS\021\028a\026\022F9o\n\018\019?yp\020=/&D2\024"
for b in str:
res += chr(dtable[b-1]) if 0 < b < 128 else chr(b)
return res
结果
print(unscramble(b"dM22r"))
j$llF
好吧,它不起作用。问题是我根本不了解 Lua,我只是根据常识在下面做出有根据的猜测。在这种特定情况下,字节串的解释似乎是错误的。
有人能指出我正确的方向吗?
【问题讨论】: