[英]How to pass lua string(binary) to c++ using tolua++
我有一个像这样的课程:
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 ++?
也许您应该停止使用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没有更好的文档,因为可能有直接执行所有操作的功能。 如果有,我找不到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.