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

从Lua向C传递大型二进制数据的最佳方法,c,lua,C,Lua,我有一个应用程序,通过LuaSockets从网络(500KB)获取大量二进制数据。(尚未实施此部分)。据我所知,这些数据将存储在某种字符串、表或数组中 我需要对这些数据进行复杂的处理,并且我有一个现有的、经过验证的ANSI-C库,为此,我需要将数据传递给C。我所研究的方法通常在调用堆栈中传递数据,由于数据大小的原因,这对我来说不起作用 现有的ANSI-C库需要一个指向数据和大小的指针。我可能可以用一个新的API来包装这个API,在这个API中,它逐字节地除去数据,最后,一旦建立了完整的API,就

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

我需要对这些数据进行复杂的处理,并且我有一个现有的、经过验证的ANSI-C库,为此,我需要将数据传递给C。我所研究的方法通常在调用堆栈中传递数据,由于数据大小的原因,这对我来说不起作用

现有的ANSI-C库需要一个指向数据和大小的指针。我可能可以用一个新的API来包装这个API,在这个API中,它逐字节地除去数据,最后,一旦建立了完整的API,就可以调用真正的API。然而,这意味着从Lua对某些C函数进行大量调用,这不是首选的,因为我需要性能


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

在我看来,您不必关心Lua堆栈的大小。Lua堆栈上的大多数元素(如果不是每个元素的话)实际上都是堆分配的。如果您使用的是luasocket,那么您收到的二进制数据已经可以作为Lua字符串(socket:receive的返回值)使用了,所以您不需要额外分配任何内容!Lua堆栈实际上更可能传递某种引用,因此复制不会发生,或者成本非常低。 要连接C库,您可以: a) 用C语言装订 b) 使用外国人 c) 卢阿吉特 在99%的情况下,我更喜欢a)。有几种方法可以做到这一点,但它似乎是一个相当苗条的C API,所以我不需要任何额外的绑定库(比如luabind)


你可以看看lua cjson source。这是一个很好的C绑定示例。

在我看来,您不必关心Lua堆栈的大小。Lua堆栈上的大多数元素(如果不是每个元素的话)实际上都是堆分配的。如果您使用的是luasocket,那么您收到的二进制数据已经可以作为Lua字符串(socket:receive的返回值)使用了,所以您不需要额外分配任何内容!Lua堆栈实际上更可能传递某种引用,因此复制不会发生,或者成本非常低。 要连接C库,您可以: a) 用C语言装订 b) 使用外国人 c) 卢阿吉特 在99%的情况下,我更喜欢a)。有几种方法可以做到这一点,但它似乎是一个相当苗条的C API,所以我不需要任何额外的绑定库(比如luabind)


你可以看看lua cjson source。这是一个很好的C绑定示例。

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


您的C应用程序将直接从Lua传递字符串。所以它在Lua堆栈上。使用
lua\u tolstring
获取字符串及其大小。这将返回一个指向Lua拥有的内存的指针(因此您需要确保它在使用Lua堆栈、注册表或其他地方时保持不变,以防止Lua对其进行垃圾收集)。然后将该字符串+大小传递给您选择的API。

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


您的C应用程序将直接从Lua传递字符串。所以它在Lua堆栈上。使用
lua\u tolstring
获取字符串及其大小。这将返回一个指向Lua拥有的内存的指针(因此您需要确保它在使用Lua堆栈、注册表或其他地方时保持不变,以防止Lua对其进行垃圾收集)。然后将字符串+大小传递给您选择的API。

如果我是您的情况,我会跳过luasocket,只使用C/C++套接字库

由于处理无论如何都要在C/C++中完成,因此使用luasocket简化了(一点)套接字处理,而代价是(显著地)使接收数据和C/C++二进制数据处理库之间的接口复杂化


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

如果我是你的话,我会跳过luasocket,只使用C/C++套接字库

由于处理无论如何都要在C/C++中完成,因此使用luasocket简化了(一点)套接字处理,而代价是(显著地)使接收数据和C/C++二进制数据处理库之间的接口复杂化


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

“据我所知,这些数据将存储在某种字符串、表或数组中。”是哪个?这是三件完全不同的事情。@nicolas这本身就是另一个问题。Lua打字不是很严格,我基本上不知道。但根据我读到的内容,它似乎是连接的:receive([size])以字符串格式返回数据报。请注意,虽然LuaSocket确实以Lua字符串形式传递二进制数据(顺便说一句,这是一种完全受支持和推荐的做法),但它并不保证任何特定调用都会生成整个数据报。此外,如果您移动500KB,它肯定不会收集一个在单个调用中返回的如此大的缓冲区。您需要根据
receive()
返回的字符串以增量方式构建数据体。一个很好的方法是将它们收集到一个表中,并将整个表传递给C端。“根据我所知,这些数据将存储在某种字符串、表或数组中。”是哪一个?这是三件完全不同的事情。@nicolas这本身就是另一个问题。Lua打字不是很严格,我基本上不知道。但是根据我读到的,它似乎是连接的:receive([size])以字符串格式返回数据报