c - 将只读缓冲区从 C 传递给 Lua

标签 c lua

我想将一个不透明的数据缓冲区从 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/

相关文章:

c - 以二进制模式写入 stdout 的最简单方法是什么?

c - 将结构数组作为参数输入 pthread_create 时出现问题

c - 当用换行符分隔时,字符串文字是否一定被视为相邻(并因此连接)?

string - Lua前沿模式匹配(全词搜索)

lua - 尝试将 nil 与数字堆栈回溯进行比较?

lua - awesome-wm:可以映射 Alt+Shift 吗?

c - 变量名与 GDB 调试器冲突

c - 无法编译链表程序

design-patterns - 如何为带有变音符号的单词编写 lua 模式

arrays - 如何将函数的所有结果存储到 Lua 中的单个变量中?