【问题标题】:How to pass lua string(binary) to c++ using tolua++如何使用 tolua++ 将 lua 字符串(二进制)传递给 c++
【发布时间】:2012-07-06 10:04:51
【问题描述】:

我有一个类:

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

【问题讨论】:

    标签: c++ lua


    【解决方案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 没有更好的文档,因为可能有一个函数可以直接完成所有这些操作。如果有,我找不到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 2018-09-02
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2018-06-12
      • 2013-07-22
      相关资源
      最近更新 更多