Lua 令人困惑 Table 参考
Lua Confusing Table Reference
我试图了解以下函数中发生的事情,但我无法跟踪它。
function whatsthis(str)
local val = ""
local vtable = "?9#sMb5\rY1>hS[=12=]5Bm~21643xN9gRK\;p![=12=]2jJ_\t4:-[=12=]0vLiA]I=6l8ec480w%7\b51,[=12=]3[=12=]4Z)9`{*kP8F}o\v\n.[EfV[=12=]6^[=12=]1nC<U7WQ&2(\fTD6Guz/+aO'q3d|H5 \ay$\"X700r@t"
for i = 1, #str do
local b = str:byte(i)
if b > 0 and b <= 127 then
val = val .. string.char(vtable:byte(b))
else
val = val .. string.char(b)
end
end
return val
end
我想,部分问题是我得到了这个练习,但我什至不知道 vtable 是 table 还是字符串!
调用示例:
string1 = whatsthis(",5MX")
我假设 str:byte(i) 将 ascii 转换为字节。 IE。 ",5MX" 到 2c 35 4d 58 但我不知道它是如何引用 vtable 或者为什么一个已经是字节的变量需要再次在 vtable:byte(b) 中重新转换。很明显,“,5MX”通过中间字节引用了 vtable,但后来我迷路了,不知道返回给 string1 的内容或原因。
更糟的是....
string2 = whatsthis("\f4kp,X6")
... 是将参数视为单个字符串还是两个值,如果 \ 不只是另一个字符,函数中如何处理转义字符。
希望我已经说清楚了。我是 lua 的新手,所以我希望有人能在这里阐明一些问题。提前致谢。
I don't even know if vtable is a table or a string!
vtable 总是一个字符串。
why a variable that is already a byte needs to be re-cast in vtable:byte(b) again
这是因为它获取了一个字符的数值,然后在位置找到一个具有该索引的字符。快速浏览一下,它似乎实现了某种替换密码,其中它将一个具有特定索引 (<=127) 的字符替换为另一个字符(取自 table)。
Part of the problem, I suppose, is that I've been given this exercise
and I don't even know if vtable is a table or a string!
您将双引号中的内容赋值给 vtable,因此它必须是字符串值。
local vtable = "?9#sMb5\rY\..."
见https://www.lua.org/manual/5.4/manual.html#3
str:byte(i)
是 string.byte(str, i)
的语法糖
见https://www.lua.org/manual/5.4/manual.html#3.4.10
string.byte(str, i)
将 return 字符串 str
中第 i
个字符的内部数字代码。所以它给你代表那个字符的字节值。
见https://www.lua.org/manual/5.4/manual.html#pdf-string.byte
I assume str:byte(i) converts ascii to bytes. ie. ",5MX" to 2c 35 4d
58
是的。
此代码将检查字符是否属于 ASCII 标准。如果是这种情况,它将把它映射到 vtable 字符串。
如果它是扩展 ASCII table 的一部分,它将按原样使用它
比较 print(whatsthis("ö"))
与 print(whatsthis("a"))
我试图了解以下函数中发生的事情,但我无法跟踪它。
function whatsthis(str)
local val = ""
local vtable = "?9#sMb5\rY1>hS[=12=]5Bm~21643xN9gRK\;p![=12=]2jJ_\t4:-[=12=]0vLiA]I=6l8ec480w%7\b51,[=12=]3[=12=]4Z)9`{*kP8F}o\v\n.[EfV[=12=]6^[=12=]1nC<U7WQ&2(\fTD6Guz/+aO'q3d|H5 \ay$\"X700r@t"
for i = 1, #str do
local b = str:byte(i)
if b > 0 and b <= 127 then
val = val .. string.char(vtable:byte(b))
else
val = val .. string.char(b)
end
end
return val
end
我想,部分问题是我得到了这个练习,但我什至不知道 vtable 是 table 还是字符串!
调用示例:
string1 = whatsthis(",5MX")
我假设 str:byte(i) 将 ascii 转换为字节。 IE。 ",5MX" 到 2c 35 4d 58 但我不知道它是如何引用 vtable 或者为什么一个已经是字节的变量需要再次在 vtable:byte(b) 中重新转换。很明显,“,5MX”通过中间字节引用了 vtable,但后来我迷路了,不知道返回给 string1 的内容或原因。
更糟的是....
string2 = whatsthis("\f4kp,X6")
... 是将参数视为单个字符串还是两个值,如果 \ 不只是另一个字符,函数中如何处理转义字符。
希望我已经说清楚了。我是 lua 的新手,所以我希望有人能在这里阐明一些问题。提前致谢。
I don't even know if vtable is a table or a string!
vtable 总是一个字符串。
why a variable that is already a byte needs to be re-cast in vtable:byte(b) again
这是因为它获取了一个字符的数值,然后在位置找到一个具有该索引的字符。快速浏览一下,它似乎实现了某种替换密码,其中它将一个具有特定索引 (<=127) 的字符替换为另一个字符(取自 table)。
Part of the problem, I suppose, is that I've been given this exercise and I don't even know if vtable is a table or a string!
您将双引号中的内容赋值给 vtable,因此它必须是字符串值。
local vtable = "?9#sMb5\rY\..."
见https://www.lua.org/manual/5.4/manual.html#3
str:byte(i)
是 string.byte(str, i)
见https://www.lua.org/manual/5.4/manual.html#3.4.10
string.byte(str, i)
将 return 字符串 str
中第 i
个字符的内部数字代码。所以它给你代表那个字符的字节值。
见https://www.lua.org/manual/5.4/manual.html#pdf-string.byte
I assume str:byte(i) converts ascii to bytes. ie. ",5MX" to 2c 35 4d 58
是的。
此代码将检查字符是否属于 ASCII 标准。如果是这种情况,它将把它映射到 vtable 字符串。
如果它是扩展 ASCII table 的一部分,它将按原样使用它
比较 print(whatsthis("ö"))
与 print(whatsthis("a"))