码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2dx中使用的tolua关于字符串处理的一个问题

时间:2014-07-01 15:50:35      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:使用   数据   os   问题   cti   代码   

在使用cocos2dx的tolua binding的过程中发现一个问题,如果返回或者输入是std::string的时候不允许包含二进制数据,而std::string是允许的,这样一来就造成了一个使用上的不对等,可能会造成一系列的问题,特别是我们需要用std::string来传递一些协议信息的时候。

造成问题的原因是tolua生成的代码对于std::string都没有加入length参数,这样就造成了一旦是二进制数据并且遇到\0就会被截断。修改的办法其实也很简单,只需要修改一下basic.lua脚本,增加如下代码即可


index fac0c7a..4c184c7 100644
--- a/projects/LastMile/Classes/lua/basic.lua
+++ b/projects/LastMile/Classes/lua/basic.lua
@@ -307,7 +307,16 @@ extern "C" {
 
 using namespace cocos2d;
 using namespace cocos2d::extension;
-using namespace CocosDenshion;]])
+using namespace CocosDenshion;
+
+static std::string bt_tocppstring(lua_State* tolua_S, int narg, const char* def) {
+       if(lua_gettop(tolua_S)<abs(narg)) {
+               return "";
+       }
+       size_t length = 0;
+       const char* data = lua_tolstring(tolua_S, narg, &length);
+       return std::string(data, length);
+}]])
 
       replace([[/* Exported function */
 TOLUA_API int  tolua_Cocos2d_open (lua_State* tolua_S);]], [[]])
@@ -323,6 +332,10 @@ TOLUA_API int  tolua_Cocos2d_open (lua_State* tolua_S);]], [[]])
 
       replace([[tolua_usertype(tolua_S,"LUA_FUNCTION");]], [[]])
 
+      replace([[tolua_tocppstring]], [[bt_tocppstring]])
+
+      replace([[tolua_pushcppstring(tolua_S,(const char*)tolua_ret);]], [[lua_pushlstring(tolua_S, tolua_ret.c_str(), tolua_ret.size());]])
+
       replace([[toluafix_pushusertype_ccobject(tolua_S,(void*)tolua_ret]],
         [[int nID = (tolua_ret) ? (int)tolua_ret->m_uID : -1;
     int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;


其实就是将里面跟cppstring相关的push和tostring都修改一下

cocos2dx中使用的tolua关于字符串处理的一个问题,布布扣,bubuko.com

cocos2dx中使用的tolua关于字符串处理的一个问题

标签:使用   数据   os   问题   cti   代码   

原文地址:http://blog.csdn.net/hopingwhite/article/details/36176309

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!