将Lua表的地址转换为Lua表。
2016-10-15 20:26:11
收藏:0
阅读:106
评论:2
假设我有一个表的地址 - 我应该如何将表变量“转换”为它? 我不关心“不良实践”或崩溃,因为这只是一个个人问题。
我想做这样的事情
lua_table tab = *(lua_table*)0xaddr
... 但是在 Lua 全局环境内。
我知道这有多糟糕,但我真的需要知道这是否可能。 这可能不是我尝试做的事情的最佳方法,但我非常确定它是最容易的方法,并且如果这是可能的话,它将起作用。 我正在使用 Lua 5.1.4。
点赞
用户646619
Lua 没有暴露出任何用于实现此功能的 API。
修改您的设计比尝试强行实现此功能要简单得多,且更加健壮。
2016-01-04 19:21:14
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
为了实现你想要的功能,你必须要:
获取 Lua 表格数据结构的指针。我相信你已经通过某种方式获得了这个指针,但 Lua 并没有任何保证你获得的指针是真正指向表格数据结构的。它可能指向其他东西。因此,你需要深入 Lua 的内部来确保你获取的指针确实指向实际对象的指针。
找到正确的类型,该类型在 Lua 的内部声明。Lua 使用一种 C 类型来表示主表格数据结构(Lua 是用 C 而不是 C++ 编写的)。你需要找到这个结构体定义并使用它。
对 Lua 库的简要检查表明,主表格数据结构在
lobject.h文件中定义,名称为Table。找到 Lua 内部 API 以正确地“操作”这个表格。它显然是一种哈希表,但你需要使用 Lua 的函数来实际做一些事情。
对 Lua 内部的简要检查表明,这些代码可能在
ltable.h文件中找到。但是,可能有更多的 API。此外,请注意,许多 API 需要一个lua_State,因此它们可能会对堆栈进行一些处理。你还需要查阅 Lua 的 API,以便学习如何使用它们而不“破坏”表格。Lua 可能对某些函数何时调用,它们之间的顺序或其他一些事情有特定的期望。如果违反这些期望,则可能会遇到某些危险。
即使这样做:
Table tab = *(Table*)0xaddr也永远不会起作用。或者至少不会像你期望的那样。Lua 是用 C 编写的。这意味着
Table不会像 C++ 值类型一样工作。复制它只会进行位拷贝。因此修改tab只会修改你本地副本的这些值。如果这些值是指向其他数据结构的指针,那么可能没有问题,因为你的指针和原始指针指向相同的数据结构。但是如果你执行一些操作,例如更改表格中的Table::flags字段,那么存储在 Lua 中的表格不会受到影响,只有你本地的tab副本会受到影响。你必须将对象作为指针而不是原始副本来操作它。
Table *tab = reinterpret_cast<Table*>(0xaddr);