将大型二进制数据从Lua传递给C的最佳方法

时间:2012-10-21 14:42:43

标签: c lua

我有一个应用程序,我通过LuaSockets从网络(500KB)获取大量二进制数据。 (尚未实现此部分)。根据我所知,这些数据将存储在某种String或表或数组中。

我需要对这些数据进行复杂处理,并且我有一个现有的,经过验证的ANSI-C Lib,我需要将数据传递给C.我看过的方法通常会传递调用堆栈中的数据。由于数据大小,对我不起作用。

现有的ANSI-C lib需要一个指向数据和大小的指针。我可以用一个新的API包装这个API,它逐字节排除数据,最后一旦建立整个大小调用真正的API,但是这意味着从Lua调用一些C函数的大量调用,因为我想要性能。

将这些大数据传递给C的最佳方法是什么? (我考虑过写一个文件并传递文件名,但这不是首选,我真的想要一个直接的内存传递)

3 个答案:

答案 0 :(得分:7)

假设LuaSocket以字符串形式提供数据,那么它非常简单。

您的C应用程序将直接从Lua传递字符串。所以它在Lua堆栈上。使用lua_tolstring获取字符串及其大小。这将返回一个指向Lua拥有的内存的指针(所以你需要确保它保留在Lua堆栈或注册表中或某个地方,当你使用它时,以防止Lu​​a垃圾收集它)。然后将该字符串+大小传递给您选择的API。

答案 1 :(得分:2)

在我看来,你不必关心Lua堆栈大小。大多数(如果不是)Lua堆栈上的每个元素实际上都是堆分配的。如果你是usinf luasocket,那么你收到的二进制数据已经可以作为Lua字符串(套接字的返回值:接收我猜),所以你不需要额外分配任何东西! Lua堆栈实际上更有可能传递各种引用,因此复制不会发生或非常便宜。 要连接C lib,您可以: a)与C绑定 b)使用外星人 c)luajit 99%的情况下,我更喜欢a)。有几种方法可以做到这一点,但它似乎是一个相当纤薄的C API,所以我没有任何额外的绑定库(如luabind)。

您可以查看lua-cjson来源http://www.kyne.com.au/~mark/software/lua-cjson-manual.html。这是C绑定的一个很好的例子。

答案 2 :(得分:1)

如果我在你的情况下,我会跳过luasocket并只使用C / C ++套接字库。

由于处理将在C / C ++中完成,因此使用luasocket简化(一点点)套接字处理,但代价是(显着)使接收数据与C / C ++二进制数据处理lib之间的接口复杂化

使用C / C ++套接字lib会使套接字处理更难(但不多),而向治疗库的数据传输将是微不足道的。