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が発生し、ポインターはnullになります。

では、どうすればluaからc ++にバイナリ文字列を渡すことができますか?

4

1 に答える 1

1

たぶん、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_pushlstringを使用してをスタックにプッシュできstd::stringます。

これをすべて直接行う機能があるかもしれないので、Toluaがより良いドキュメントを持っていないのは残念です。もしあれば、私はそれを見つけることができませんでした。

于 2012-07-06T15:55:48.817 に答える