I hava a class like:
class SomeClass
{
void initFromBuffer(void* buffer,int length);
void initFromString(const std::string& str);
}
Using tolua++, got the binding like:
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);
}
and:
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);
}
Now,i want to pass binary data from lua to c++,the binary has ‘\0’ in it,so if i use initFromString to pass it, the binary data will be trimed. But if i use initFromBuffer to pass it, i got bad ptr at `void* buffer = ((void*) tolua_touserdata(tolua_S,2,0));, the pointer is null.
So, how could i pass binary string from lua to c++?
Maybe you should stop using Tolua’s bad APIs and use plain Lua’s actually good APIs. Both std::string and Lua strings are capable of storing embedded null characters. The only reason
tolua_tocppstringcauses truncation is because the function name is a lie. It doesn’t convert it to a C++ string; it converts it to a C string, aconst char*.The correct answer is to use the proper API function:
Similarly, you can use lua_pushlstring to push a
std::stringonto the stack.It’s unfortunate that Tolua doesn’t have better documentation, as there may be a function to do this all directly. If there is, I couldn’t find it.