1

我有一个类:</p>

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)); 处得到了错误的 ptr,指针为空。

那么,我如何将二进制字符串从 lua 传递到 C++?

4

1 回答 1

1

也许你应该停止使用 Tolua 的糟糕 API,而使用普通 Lua 真正好的API。std::string 和 Lua 字符串都能够存储嵌入的空字符。导致截断的唯一原因tolua_tocppstring是函数名是谎言。它不会将其转换为 C++ 字符串;它将其转换为C 字符串a 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_pushlstring将 a 压入std::string堆栈。

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

于 2012-07-06T15:55:48.817 回答