[lua/unity/cocos2dx]关于云风pbc不支持int64的解决办法
2017-03-03 16:41
465 查看
其实这个很简单,因为源码都有,改改就好,但是估计有些人很担心改了之后出现各种问题解决不了,我通常是先改,出问题再说,哈哈。不过其实去看看源码,云风的代码还是写的很清晰的
以上是废话
找到pbc-lua.c
搜索case PBC_INT64
会发现这里对于int64的处理直接处理成了lua_Number,那么这里就可以根据个人需求来修改了。不过看pbc其他地方的处理,会发现其他地方通过luastring来处理,其实为了减小依赖,这样最方便
大致的代码是这样
这里其实就是把值设置到一个table里
废话一下
有些C/C++基础不好的人看到这个就纳闷了,我需要的是int64,你给我弄成字符串是什么意思?
熟悉这些的自然不用解释,如果你注意看就会发现这里没有用sprintf而是直接指针强转。对于直接操作内存的语言来说,其实只要内存的值是一样的,管你是什么类型,类型只是方便操作的工具而已。
问题来了,这样在lua里是用不了的,怎么办?
其实很简单,因为lua51是不支持int64的,那么肯定要自己实现int64的支持,就拿cocos2dx为例,其内置里一个Integer64类,用于lua处理int64
对于cocos2dx,我是这样处理的,找到Integer64.h,在函数toLua_integer64里面加入
加入pb文件这样定义
lua那边的使用:
Unity同理,自己实现一个int64支持就好
以上是废话
找到pbc-lua.c
搜索case PBC_INT64
会发现这里对于int64的处理直接处理成了lua_Number,那么这里就可以根据个人需求来修改了。不过看pbc其他地方的处理,会发现其他地方通过luastring来处理,其实为了减小依赖,这样最方便
大致的代码是这样
case PBC_INT64: { uint64_t v64 = (uint64_t)(v->i.hi) << 32 | (uint64_t)(v->i.low); //lua_pushnumber(L,(lua_Number)(int64_t)v64);//原本的实现 lua_pushlstring(L, (const char *)&v64, sizeof(v64)); break; }
这里其实就是把值设置到一个table里
废话一下
有些C/C++基础不好的人看到这个就纳闷了,我需要的是int64,你给我弄成字符串是什么意思?
熟悉这些的自然不用解释,如果你注意看就会发现这里没有用sprintf而是直接指针强转。对于直接操作内存的语言来说,其实只要内存的值是一样的,管你是什么类型,类型只是方便操作的工具而已。
问题来了,这样在lua里是用不了的,怎么办?
其实很简单,因为lua51是不支持int64的,那么肯定要自己实现int64的支持,就拿cocos2dx为例,其内置里一个Integer64类,用于lua处理int64
对于cocos2dx,我是这样处理的,找到Integer64.h,在函数toLua_integer64里面加入
static int toLua_Integer64(lua_State* L) { int argc = lua_gettop(L); if(argc == 0) { return new_Integer64(L,0); } else if (argc == 1) { int64_t tmpdata = 0; if (lua_type(L, 1)== LUA_TSTRING) { size_t len = 0; const char * number = lua_tolstring(L, 1, &len); if (len != 8) { return luaL_error(L, "Need an 8 length string for int64"); } tmpdata = *(int64_t*)number; } else { tmpdata = (int64_t)lua_tonumber(L, 1); } return new_Integer64(L,tmpdata); } return 0; }
加入pb文件这样定义
mytest{ optional int64 value = 1; }
lua那边的使用:
local r = protobuf.decode("mypbtest",databuffer) local v64 = Interger64.new(r.value) print("An int64 value:"..v64)
Unity同理,自己实现一个int64支持就好
相关文章推荐
- [lua/unity/cocos2dx]关于云风pbc不支持int64的解决办法 标签: unitycocos2d-xluauluapbc 2017-03-03 16:41 639人阅读 评论(0)
- 关于firefox不支持text-overflow:ellipsis;的解决办法
- 关于使用jquery时,ie8下提示对象不支持的属性或方法的解决办法
- 关于IE8 及以下版本不支持Map() 对象的解决办法
- 关于MySQL存储过程不支持数组的解决办法
- 关于IOS二维码创建、扫描的使用方式(IOS,ZBar支持64位解决办法)
- 关于webservice不支持方法重载的解决办法
- 关于bootstrap-datetimepicker.js不支持IE8的解决办法
- 关于Mozilla浏览器不支持innerText的解决办法
- 关于ES5之前不支持Object.create(proto)解决办法
- 关于Spring2.X AOP采用Annotation方式不支持JDK1.6的解决办法
- 关于”因为此版本的应用程序不支持其项目类型(.csproj)“错误的解决办法
- 关于C#中webbrower控件调用的浏览器不支持热力图功能的解决办法
- 关于webservice不支持方法重载的解决办法
- 关于ubuntu网卡支持问题的解决办法
- 关于IE8版本提示“不支持‘trim’此属性或者方法”的解决办法。转摘雨网络
- 关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。
- 关于IE7打开任何网页弹出[未处理的异常('对象不支持此属性或方法')发生在iexplorer.exe]错误调试框的解决办法
- 关于苹果审核,应用需支持IPV6的解决办法
- 关于hadoop 1.2.1版本不支持“dfs.support.append”参数的解决办法