我想将一个不透明的数据缓冲区从 C 传递到 Lua 而无需实际复制所有数据(因为它可能非常大,有 100 MB 或 GB)。
更具体地说,我有一个如下所示的 C 代码段:
uint8_t *buffer = // points to some memory
size_t size = // size of the buffer
我的 C 程序不知道缓冲区中数据的结构。它完全没有注意到它。除了调用负责使用此数据的 Lua 函数之外,它永远不会触及此数据。
我的目标是将这个缓冲区传递给 Lua,然后 Lua 将解释数据的内容并根据它执行各种操作(Lua 代码知道如何根据数据的内容或大小来确定数据的结构).此外,Lua 代码不会修改缓冲区(仅从中读取)。
下面是我的理想功能的一些示例伪代码:
bool perform_action(lua_State *L, uint8_t *buffer, size_t size) {
// Pass buffer to lua
// call "process_buffer" function (written in Lua)
// get return from "process_buffer" function (a boolean)
// free(buffer);
// return the result above
}
这个问题,我想,是相关的:lua newbie : C-Lua How to pass a struct/buffer to lua from C? .但是,该线程中的解决方案是:“使用 LuaJIT”,这对我来说没有任何意义。
一个潜在的解决方案是使用:
lua_pushlstring (L, buffer, size);
但这不会复制数据吗?有没有办法用零拷贝来做到这一点(因为数据非常大)?
如有任何帮助,我们将不胜感激。谢谢!
最佳答案
正如您已经注意到的,lua_pushlstring
是将原始数据以字符串形式推送到 Lua 的常用方法。为避免复制,您需要将弱指针推送到 Lua,这会引导您访问 userdata。但是如何在 Lua 中将这个用户数据重新解释为一个字符串呢?简而言之:你不能!使用 LuaJIT,您可以将 userdata 转换为 CData 指针(您的 userdata 将是一个结构,它包含您的缓冲区 + 大小)- 简单直接。否则,您必须通过向用户数据添加一个元表来复制,这允许将片段提取为字符串并请求大小。
关于c - 将只读缓冲区从 C 传递给 Lua,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32813686/