正在使用cocos2dx的tolua binding在此过程中发现的一个问题。假设一回或输入是std::string当我们不同意包括二进制数据,和std::string我同意,这样一来就导致了不正确的使用等。这可能会导致一系列的问题,特别是,我们需要使用std::string议信息的时候。

造成问题的解决办法是tolua生成的代码对于std::string都没有添加length參数,这样就造成了一旦是二进制数据而且遇到\0就会被截断。

改动的办法事实上也非常easy,仅仅须要改动一下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关于字符串处理的一个问题的更多相关文章

  1. cocos2dx之tolua++全面分析(一):tolua++工具本身

    在cocos2dx/tools/tolua++下面,有大量pkg文件,这些是按tolua++要求格式写好的.需要导出到lua中的c++类描述文件. 每当在c++类里增加了新函数需要导出时,应同步修改相 ...

  2. Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  3. C++在字符串前加一个L作用:

    在字符串前加一个L作用:    如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节.    strlen("asd" ...

  4. 获取一个字符串中每一个字母出现的次数使用map集合

    package 获取字符串中单字符出现次数; import java.util.Scanner; import java.util.TreeMap; /* * 需求:获取一个字符串中每一个字母出现的次 ...

  5. oracle中一个字符串包含另一个字符串中的所有字符

    oracle中一个字符串包含另一个字符串中的所有字符 --解决监理报告中所勾选的标段信息,与该用户所管理的标段字符串不匹配的问题. select * from a where instr(a,b)&g ...

  6. php 判断字符串在另一个字符串中位置

    $email='user@example.com';        //定义字符串$result=strstr($email,'@');         //返回子字符串echo $result; / ...

  7. PHP:strpos()-返回字符串在另一个字符串中第一次出现的位置

    strpos()函数返回字符串在另一个字符串中第一次出现的位置.如果没有找到该字符串,则返回false. 语法:strpos(sting, find [, start]) string ,必须,要搜索 ...

  8. js字符串长度计算(一个汉字==两个字符)和字符串截取

    js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\ ...

  9. Java 一个字符串在另外一个字符串出现次数

    统计一个字符串在另外一个字符串出现次数 代码如下: package me.chunsheng.javatest; import java.util.regex.Matcher; import java ...

随机推荐

  1. QString与char*的相互转换

    原地址:http://blog.sina.com.cn/s/blog_5c70dfc80100r0nh.html 一.QString转char*   QString str; int num=0; s ...

  2. log4net概述

    log4net概貌 log4net是一个框架,用来记录日志的框架.为什么要记录日志呢?每个程序员都不能保证自己的程序完全没有错误,可是当程序已经部署的时候出现错误怎么办?我们这时候就要根据我们的日志文 ...

  3. 如何获得getElementById的length这个数值?

    a=document.getElementById("a").innerHTML.length;我觉得你应该这么写 如果是文本框的话document.getElementById( ...

  4. FORM验证简单demo

    详解稍后加入. 项目结构如图: web.xml <?xml version="1.0" encoding="UTF-8" ?> <web-ap ...

  5. FZOJ2111:Min Number

    Problem Description Now you are given one non-negative integer n in 10-base notation, it will only c ...

  6. Python Unittest 自动化单元测试框架Demo

    python 测试框架(本文只涉及 PyUnit) https://wiki.python.org/moin/PythonTestingToolsTaxonomy 环境准备 首先确定已经安装有Pyth ...

  7. Swift - 歌曲播放样例(附带播放时间和播放进度)

    使用MPMoviePlayerController我们可以是进行音乐播放,下面是一个播放器样例.同时,播放时还可以显示播放时间和播放进度. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  8. 暂停和屏蔽右键网页中的Flash

    如何暂停网页中的Flash?原理很简单,就是屏蔽Flash的消息即可.屏蔽右键也可以通过此方法 直接贴代码吧,加了注释,很容易就能懂了 新建工程,加一个WebBrowser,再加两个按钮.Flash ...

  9. 线程同步辅助类——Exchanger

    下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...

  10. 11 款最好 CSS 框架 让你的网站独领风骚

    网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...