protoc-gen-lua
lua里使用proto buffer
protoc-gen-lua
官方不维护了,自己维护个:protoc-gen-lua
- int64支持,将64位int转换成lua的string。
- message相互嵌套引用,不依赖定义的顺序。
- import的bug
protoc-gen-lua int64支持
lua 5.1里使用double表示number,然后double最多兼容int53。
项目中协议已经使用int64了,为了支持int64,将int64全部转换成string来处理。
看懂protoc-gen-lua的decode、encode代码,在熟悉下protbuf的存储格式。然后修改编解码部分。
protoc-gen-lua import bug
官方的protoc字段名都是定义成local变量,外部不可访问,import引用就挂了。
修改后,字段名都当成module里的全局变量,损失性能,但是外部可以访问。
proto buffer的一些细节
google开源的序列化工具,类似json,二机制格式。
存储格式
protobuf把message保存成一系列key-value对。
key由每个field的index和type来确定,算法key = (index<<3) | type。使用varint格式保存,所以index小于16才能用一个字节保存。
value随type不同,有不同的保存方式。
| type | 对于的message的类型 | 编码存储说明 |
| 0 | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
varint、zigint |
| 1 | fixed64, sfixed64, double | 64-bit |
| 2 | string, bytes, embedded messages, packed repeated fields | 长度(varint) + 内容 |
| 5 |
fixed32, sfixed32, float |
32-bit |
额外说明下packed repeated fields
对于repeated类型的字段,可以不用连续存储,每个都是key+value,只是key都是一样的。
使用packed可以达到压缩key的效果,整体连续存储为key+size+value+value+...。
例子:
message Test {repeated int32 d = 1 [packed=true];}假设添加两个数字`1,128`。序列号结果:08 key03 字节数01 数字180 01 数字128
varint
变长int,用一个或多个字节表示整数。值越小,字节数越少。整数在这里都是当成无符号。
具体这么做:
- varint的每个字节的最高bit位表示数字序列有没有结束。1表示没有结束,0表示结束。
- 每个字节的剩余7个bit位存储数字的有效bit位。如果数字小于128,就只要1个字节了,如64表示为
01000000。 - 字节序使用的小端序。
数字150转换过程:
- 二机制表示
10010110 - 划分7bit位
00000001 00010110 - 反序
00010110 00000001 - 设置最高位
10010110 00000001
zigint
varint有个缺点,如果是负数,就达不到压缩字节数的效果。因为最高位是1,是个有效位。
如int64类型的-1,要使用10个字节,而绝对值只有1。
zigint就是针对这种情况处理的。先用zigzag重新编码下数字,再使用varint存储。
int64转换公式:
zig_int = (signed_int << 1) ^ (signed_int >> 63)signed_int = (zig_int >> 1) ^ - (int64_t)(n & 1)
这种表示方法类似于1个bit位保存符号为,其他的保存绝对值。
但是64用zigint标识就得两个字节了,保存的是128。
搜集的资料等
- protobuf序列化原理
- Google Protocol Buffer 的使用和原理
- Gooogle Protoc-gen-lua
- protoc-gen-lua github 好像不维护了
- protoc-gen-lua int64支持,有条件的,实际是int32才能不出错
- protoc-gen-lua int64支持,将64位int转换成lua的string,修改不少bug
protoc-gen-lua的更多相关文章
- thrift的lua实现
最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift接口来根据坐标获取城市信息 ...
- uLua学习笔记(三):Unity3D和Lua之间的相互调用
这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...
- Java调用Lua(转)
Java 调用 Lua app发版成本高,覆盖速度慢,覆盖率页低.一些策略上的东西如果能够从服务端控制会方便一些.所以考虑使用Lua这种嵌入式语言作为策略实现,Java则是宿主语言. 总体上看是一个模 ...
- thrift的lua
thrift的lua实现 最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift ...
- Thrift的TBinaryProtocol二进制协议分析
先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...
- ulua学习笔记(二):官方资料及问题解决方案
uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...
- unity3d热更新插件uLua学习整理
前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeD ...
- Unity编程笔录--ulua+PureMVC框架简单热更新使用
ulua+PureMVC框架简单热更新使用 前言: 1:作者官网论坛 首先介绍的是这个框架是一位大牛 骏擎[CP] jarjin 写的,据说原本是"非常多人不知道怎么使用Ulua,所 ...
- LuaFramework 学习
LuaFramework_UGUI_V2 https://github.com/jarjin/LuaFramework_UGUI_V2 using UnityEngine; using LuaInte ...
- 热更新解决方案--tolua学习笔记
一.tolua使用准备工作:从GitHub上下载tolua(说明:这篇笔记使用的Unity版本是2019.4.18f1c1,使用的tolua是2021年4月9日从GitHub上Clone的tolua工 ...
随机推荐
- svn 提交失败 更新失败 提示 已经锁定
出现问题的原因:在上传的时候,由于网络掉线,导致svn提交到一半就没有反应了,这个时候我点击了取消,再之后无论是进行 更新还是提交,都提示 已经锁定 解决方法:在项目的空白地方,点击SVN 清理 ...
- UVALive 4043 Ants(二分图完美匹配)
题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...
- Content-Type
HTTP Content-type .*( 二进制流,不知道下载文件类型) application/octet-stream .txt text/plain 没有csv这种类型
- css垂直水平居中方案
1. 水平居中 如果是inline元素:在父元素上面设置text-align:center; 如果是block元素:设置宽度和margin:0 auto; 如果是多块级元素:在父元素上面设置text- ...
- vc2005编译ffmpeg以及ffplay
ffmpeg编译过程:1 http://ffmpeg.zeranoe.com/builds/下载官方提供的源码,win32库和dll.2 新建vc2005 console空工程,把ffmpeg.h,f ...
- android bin目录下的.ap_是神马文件?
resources.ap_ resources翻译过来是资源的意思 应该就是一种中间文件,可以改成rar.zip等压缩文件的类型,里面包含res.AndroidMainfest.xml.resourc ...
- 阿里云容器服务--配置自定义路由服务应对DDOS攻击
阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...
- 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)
1.0 为什么要做这个博客站? www.zynblog.com 在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...
- Oracle数据库表结构导出
1. 在PL/SQL中找到"工具--导出用户对象"菜单.点击运行.
- ylbtech-权限管理-数据库设计-功能权限管理技术
ylbtech-DatabaseDesgin:ylbtech-权限管理-数据库设计-功能权限管理技术 DatabaseName:ylb_permission(权限管理-功能权限管理技术)实现 Type ...