Lua 中令人疑惑的表格引用

我试图理解以下函数中发生了什么,但是我无法跟踪它。

function whatsthis(str)
  local val = ""
  local vtable = "?\029#sMb5\rY\041>hS\005Bm~2\021\016\024\023xN\019gRK\\;p!\002jJ_\t4:-\000vLiA]I=6l\018ec\0248\030w%7\b\0151,\003\004Z)9`{*kP\028F}o\v\n.[EfV\006^\001nC<U\027WQ&\022(\fTD\026Guz/+aO'q3d|H\025 \ay$\"X\017\0200r@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 是一个表还是一个字符串!

示例调用:

string1 = whatsthis(",5MX")

我认为 str:byte(i) 将 ascii 转换为字节。 即,",5MX" 转换为 2c 35 4d 58,但我不知道它如何引用 vtable 或者为什么需要将一个已经是字节的变量再次转换为 vtable:byte(b)。当然,可以通过中间字节来清晰地看到 ",5MX" 是如何引用 vtable 的,但是然后我就无从下手,不知道返回到 string1 中什么东西,也不知道为什么。

更糟糕的是……

string2 = whatsthis("\f4kp,X\026")

……是否将该参数视为单个字符串或两个值,如果其中没有 \ 作为另一个字符,则该函数如何处理 \ 转义。

我希望我表述得清楚。由于我是 lua 的新手,所以希望有人能在这里解释一下。提前感谢您。

原文链接 https://stackoverflow.com/questions/69179492

点赞
stackoverflow用户1442917
stackoverflow用户1442917

我甚至不知道 vtable 是一个表格还是一个字符串!

vtable 总是一个字符串。

为什么已经是一个字节的变量需要再次通过 vtable:byte(b) 进行重新转换?

这是因为它获取字符的数值,然后在位置上使用该索引查找一个字符。乍一看,它似乎实现了某种替换密码,其中使用表格中的不同字符(取自指定的索引(<=127))替换某个具有特定索引的字符。

2021-09-14 14:45:44
stackoverflow用户2858170
stackoverflow用户2858170

问题的一部分,我想,是因为我被给了这个练习,但我甚至不知道 vtable 是一张表还是一串字符串!

你将双引号中的内容分配给了 vtable,所以它必须是一个字符串值。

local vtable = "?\029#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) 会返回字符串 str 中第 i 个字符的内部数字代码。因此,它会给出表示该字符的字节值。

参见 https://www.lua.org/manual/5.4/manual.html#pdf-string.byte

我假设 str:byte(i) 将 ASCII 转换为字节。例如。",5MX" 转换成 2c 35 4d 58

是的。

这段代码将检查一个字符是否是 ASCII 标准的一部分。如果是,它将映射到 vtable 字符串中。

如果它是扩展 ASCII 表的一部分,它将按原样使用。

比较 print(whatsthis("ö"))print(whatsthis("a"))

2021-09-14 14:47:19