[lua/unity/cocos2dx]关于云风pbc不支持int64的解决办法 标签: unitycocos2d-xluauluapbc 2017-03-03 16:41 639人阅读 评论(0)

来源:互联网 发布:mac上看电视的软件 编辑:程序博客网 时间:2024/05/29 15:48
 

[lua/unity/cocos2dx]关于云风pbc不支持int64的解决办法

标签: unitycocos2d-xluauluapbc
 639人阅读 评论(0) 收藏 举报
 分类:
 

其实这个很简单,因为源码都有,改改就好,但是估计有些人很担心改了之后出现各种问题解决不了,我通常是先改,出问题再说,哈哈。不过其实去看看源码,云风的代码还是写的很清晰的

以上是废话


找到pbc-lua.c

搜索case PBC_INT64

会发现这里对于int64的处理直接处理成了lua_Number,那么这里就可以根据个人需求来修改了。不过看pbc其他地方的处理,会发现其他地方通过luastring来处理,其实为了减小依赖,这样最方便


大致的代码是这样

[cpp] view plain copy
  1. case PBC_INT64: {  
  2.         uint64_t v64 = (uint64_t)(v->i.hi) << 32 | (uint64_t)(v->i.low);  
  3.         //lua_pushnumber(L,(lua_Number)(int64_t)v64);//原本的实现  
  4.         lua_pushlstring(L, (const char *)&v64, sizeof(v64));  
  5.         break;  
  6.     }  


这里其实就是把值设置到一个table里


废话一下

有些C/C++基础不好的人看到这个就纳闷了,我需要的是int64,你给我弄成字符串是什么意思?

熟悉这些的自然不用解释,如果你注意看就会发现这里没有用sprintf而是直接指针强转。对于直接操作内存的语言来说,其实只要内存的值是一样的,管你是什么类型,类型只是方便操作的工具而已。


问题来了,这样在lua里是用不了的,怎么办?

其实很简单,因为lua51是不支持int64的,那么肯定要自己实现int64的支持,就拿cocos2dx为例,其内置里一个Integer64类,用于lua处理int64

对于cocos2dx,我是这样处理的,找到Integer64.h,在函数toLua_integer64里面加入

[cpp] view plain copy
  1. static int toLua_Integer64(lua_State* L)  
  2. {  
  3.     int argc = lua_gettop(L);  
  4.   
  5.     if(argc == 0)  
  6.     {  
  7.         return new_Integer64(L,0);  
  8.     }  
  9.     else if (argc == 1)  
  10.     {  
  11.         int64_t tmpdata = 0;  
  12.         if (lua_type(L, 1)== LUA_TSTRING) {  
  13.             size_t len = 0;  
  14.             const char * number = lua_tolstring(L, 1, &len);  
  15.             if (len != 8) {  
  16.                 return luaL_error(L, "Need an 8 length string for int64");  
  17.             }  
  18.             tmpdata = *(int64_t*)number;  
  19.         }  
  20.         else {  
  21.             tmpdata = (int64_t)lua_tonumber(L, 1);  
  22.         }  
  23.         return new_Integer64(L,tmpdata);  
  24.     }  
  25.     return 0;  
  26. }  


加入pb文件这样定义

[plain] view plain copy
  1. mytest{  
  2. optional int64 value = 1;  
  3. }  



lua那边的使用:

[plain] view plain copy
  1. local r = protobuf.decode("mypbtest",databuffer)  
  2. local v64 = Interger64.new(r.value)  
  3. print("An int64 value:"..v64)  


Unity同理,自己实现一个int64支持就好


阅读全文
0 0
原创粉丝点击