将C语言中的结构体地址传递给Lua,在Lua中访问其内容而不复制数据

考虑我有一个数据包(网络数据包),它存储在 C 中的一个数组中。我有一个在 Lua 中可以处理此数据包的模块。现在我需要将该数据包传递给 Lua 进行处理。我想避免复制数据。为此,我可以使用_userdata_ 或_ lightuserdata_。但在这种情况下,基址将被推到堆栈顶部,我需要在 Lua 中编写回调或在 C 中编写元表来进行处理。

我正在面临如何开始编写 C 中的基本小回调的困难。我所需的只是假设我有如下结构:

struct abc_{
    int a;
    int b;
    char* c;
} abc_t;

int arr1[] = {'100', '2', '4', '5', '6'};

现在我有一个包含一些数据的数组。在 C 中,我可以将该数组与此结构进行类型转换以获取特定值。

abc_t *test;
test = (abc_t *)arr1;

同样,在 Lua 中,我如何做到相同的(通过传递 arr1 的地址到栈顶,并在 C 中定义结构体)并获取变量a,b的值而不进行复制?

问题2

假设我正在使用 C 并使用 Lua 堆栈处理数组。

如果我要访问a[2],其中 a 是我的表格而 2 是索引,则 2 需要在堆栈顶部,我需要将a的位置作为第二个参数传递给 lua_gettable()。我要如何对一个_结构体_做同样的事情?我想访问结构的特定元素。如何做到这一点?

点赞
用户1008957
用户1008957

如果您不想将C中的结构数据复制到Lua中,则需要使用专用元表将指向结构实例的指针封装到完整的_userdata_中。轻量级userdata不足以用于此类情况,因为您无法为其分配元表。

元表应定义__index__newindex元方法。如果Lua传递的索引为“a”、“b”或“c”,则元方法返回或分配相应的结构字段。__gc元方法可以在结构实例上调用free__tostring元方法始终适用于调试。

如果您使用题标签建议的_luabind_,该库能够为您生成元表。您也可以手动编写绑定。

回答您的第二个问题,如果您按建议定义__index,则可以通过首先将_userdata_推送到堆栈,然后将字段名称作为字符串推送,然后使用lua_gettable访问字段。这个功能的快捷方式由函数lua_getfield提供。

2012-12-24 10:32:38