如何使用 tolua++ 将 Lua 字符串(二进制)传递到 C++?

我有一个这样的类:

class SomeClass
{
   void initFromBuffer(void* buffer,int length);
   void initFromString(const std::string& str);
}

使用 tolua++,得到的绑定如下所示:

static int SomeClass_initFromBuffer00(lua_State* tolua_S)
{
  SomeClass* self = (SomeClass*)  tolua_tousertype(tolua_S,1,0);
  void* buffer = ((void*)  tolua_touserdata(tolua_S,2,0));
  int length = ((int)  tolua_tonumber(tolua_S,3,0));
  self->initFromBuffer(buffer,length);
}

和:

static int SomeClass_initFromString00(lua_State* tolua_S)
{

   SomeClass* self = (SomeClass*)  tolua_tousertype(tolua_S,1,0);
   const std::string str = ((const std::string)  tolua_tocppstring(tolua_S,2,0));
   self->initFromString(str);
   tolua_pushcppstring(tolua_S,(const char*)str);
}

现在,我想从 Lua 传递二进制数据到 C++,这些二进制数据中包含 '\0',所以如果我使用 initFromString 来传递它,二进制数据将被截取。但是如果我使用 initFromBuffer 来传递它,我得到一个在 `void* buffer = ((void*) tolua_touserdata(tolua_S,2,0)); 处的空指针。

那么,我该如何从 Lua 向 C++ 传递二进制字符串?

点赞
用户734069
用户734069

也许你应该停止使用 Tolua 的不好的 API,而是使用纯 Lua 的实际上是“好”的 API。std :: string 和 Lua 字符串都能够存储嵌入的空字符。tolua_tocppstring 导致截断的唯一原因是因为函数名称是一个谎言。它不将其转换为 C++ 字符串;它将其转换为 C 字符串,即 const char *

正确的答案是使用正确的 API 函数:

std::string fromLuaStack(lua_State *lua, int stackIx)
{
  size_t len;
  const char *str = lua_tolstring(lua, stackIx, &len);
  return std::string(str, len);
}

同样,您可以使用lua_pushlstringstd::string 推入堆栈。

不幸的是,Tolua 没有更好的文档,因为可能有一个函数可以直接完成这个工作。如果有,我也没找到它。

2012-07-06 15:55:48