【问题标题】:Lua Confusing Table ReferenceLua 混淆表参考
【发布时间】:2021-11-09 17:43:37
【问题描述】:

我正在尝试了解以下函数中发生了什么,但我无法跟踪它。

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 转换为字节。 IE。 ",5MX" 到 2c 35 4d 58 但我不知道它是如何引用 vtable 的,也不知道为什么需要在 vtable:byte(b) 中重新转换已经是一个字节的变量。很明显 ",5MX" 通过中间字节引用了 vtable,但后来我迷路了,不知道什么会返回到 string1 或为什么。

让事情变得更糟......

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

... 该参数是否被视为单个字符串或两个值,如果不作为另一个字符,\ 在函数中如何处理转义符。

我希望我已经清楚了。我是 lua 的新手,所以我希望有人可以在这里有所启发。提前致谢。

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    我想,部分问题在于我已经完成了这个练习 而且我什至不知道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 转换为字节。 IE。 ",5MX" 到 2c 35 4d 58

    是的。

    此代码将检查字符是否是 ASCII 标准的一部分。如果是这种情况,它会将其映射到 vtable 字符串。

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

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

    【讨论】:

    • 优秀。我会玩弄它的。我相信它会有所帮助。至少,我觉得我现在有了方向。谢谢。
    【解决方案2】:

    我什至不知道vtable是表格还是字符串!

    vtable 总是一个字符串。

    为什么一个已经是字节的变量需要在 vtable:byte(b) 中重新转换

    这是因为它获取一个字符的数值,然后在具有该索引的位置处找到一个字符。乍一看,它似乎实现了某种替换密码,它将具有特定索引 (

    【讨论】:

    • 好好。是的,它绝对是类似密码的。只需字符串操作即可更好地处理不熟悉的语言。谢谢,伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多