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

Passing byte array to lua script method from C++

本文关键字:字节 字节数 数组 方法 C++ lua 脚本      更新时间:2023-10-16

如何将字节数组作为参数从C++代码传递给lua脚本方法?只允许使用int、float或字符串数据类型吗?此外,我如何从lua脚本方法检索字节数组?我将把一个原始字节数组传递给脚本。它将解析并使用它。Thanx。

这取决于你想要做什么。Lua字符串是不可变的字节数组,所以如果它们很小,你最好把字节数组变成一个带有lua_pushlstring的字符串,然后像这样传递它——是的,嵌入式\0是受支持的,并且运行良好。但由于它们是不可变的,每次你想修改字符串时,Lua都会复制它,所以它可能不适合你的需求。

其他选项包括:

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

  • 将C++字节数组封装在lightuserdata中,并提供Lua绑定以允许您直接访问它。这是最高效的,但代码量相当大。

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

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

lua_pushlightuserdata(L, bufptr);

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

lua_pushlstring (L, bufptr, buflen);

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

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