如何使用tolua ++将lua字符串(二进制)传递给c ++

时间:2012-07-06 10:04:52

标签: c++ lua

我有一个类似的课程:

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 ++?

1 个答案:

答案 0 :(得分:1)

也许您应该停止使用Tolua的错误API并使用普通的Lua实际上良好的 API。 std :: string和Lua字符串都能够存储嵌入的空字符。 tolua_tocppstring导致截断的唯一原因是因为函数名称是谎言。它不会将其转换为C ++字符串;它将其转换为 C字符串const char*

正确答案是使用the proper API function

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没有更好的文档,因为可能有一个函数可以直接执行此操作。如果有,我找不到它。