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