从 C++ 将字节数组传递给 lua 脚本方法

Posted

技术标签:

【中文标题】从 C++ 将字节数组传递给 lua 脚本方法【英文标题】:Passing byte array to lua script method from C++ 【发布时间】:2011-09-05 13:24:28 【问题描述】:

如何将字节数组作为参数从 C++ 代码传递给 lua 脚本方法? 是否只允许使用 int、float 或 string 数据类型? 另外,我如何从 lua 脚本方法中检索字节数组? 我会将原始字节数组传递给脚本。它将解析并使用它。 谢谢。

【问题讨论】:

【参考方案1】:

取决于你想做什么。 Lua 字符串是不可变的字节数组,因此如果它们很小,您最好将字节数组转换为带有 lua_pushlstring 的字符串并像这样传递它 --- 是的,支持嵌入的 \0 并且工作正常.但是因为它们是不可变的,Lua 每次你想修改它时都会复制字符串,所以它可能不适合你的要求。

其他选项有:

在 C++ 字节数组和 Lua 数组(即数字表)之间来回复制数据。这在内存上会相当昂贵,但可能是最简单的方法。

将您的 C++ 字节数组包装在一个 lightuserdata 中,并提供 Lua 绑定让您直接访问它。这是最有效的,但代码量很大。

【讨论】:

【参考方案2】:

Int 和 float 值将被转换为 Lua 的数字类型(默认为double)。

如果脚本本身只需要保留一个指针在函数之间传递,C 数据块通常作为轻用户数据推送:

lua_pushlightuserdata(L, bufptr);

向 Lua 传递字节数组时,通常使用字符串(可以使用lua_pushlstring 创建任意数据的字符串):

lua_pushlstring (L, bufptr, buflen);

这将在 Lua 中创建一个不可变字符串,只能通过创建新字符串来修改。

如果您需要在 Lua 中使用可变字节缓冲区(不推荐 - 低级字节操作是 C 设计的,而 Lua 不是),最好的办法是为缓冲区创建一个用户数据类型,并使用以下方法获取和设置为用例量身定制(个别位置为数字,范围为字符串或数字表)。

【讨论】:

以上是关于从 C++ 将字节数组传递给 lua 脚本方法的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?

将字节数组从 c++ 传递给 python

将字节数组从 C 传递到 Lua

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

将 C# char 数组传递给 C++ 与字节数组不同

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#