Protocol Buffers编码特点

本文详细探讨了Protocol Buffers在PHP环境下的应用与实现过程,包括解决PHP缺乏良好第三方插件的问题,通过编写PHP扩展来支持Protocol Buffers。文章回顾了PB的varints编码机制,特别是负数的ZIGZAG编码方式,解释了移位操作在该转换过程中的作用。通过实例分析,揭示了正负整数如何在移位和异或操作下实现转换,提供了深入理解Protocol Buffers编码机制的见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下半年的KPI中,有一条是推动Protocol Buffers在部门中的应用。对于java来说,已经没什么问题,用官方的代码生成编译器已经能很好的解决问题。但对于PHP来说,并没有太好的第三方插件,要么是很不完善,要么就是性能太差。暂时的打算是写一个php扩展,给其他人使用。
对于Protocol Buffers,之前有过一些研究,写过一篇博文[url=http://www.searchtb.com/2010/11/protocol-buffers%e7%9a%84%e5%ba%94%e7%94%a8%e4%b8%8e%e5%88%86%e6%9e%90.html]Protocol Buffers的应用与分析[/url],但时隔境迁不少东西已经忘记了,同时对一些细节也了解得不是太深入。
下午的时候,回顾了一下PB的varints编码,其中有一块对于负数的编码采用了ZIGZAG的方式(无符号0~4294967295)。方式为(n << 31 ^ n >> 1),对于移位操作并不太熟悉,因此不大明白这块转换是如何完成的。
首先n << 31:对于正int来说,移位完将变成0;而对于负int来说,移位完,所有的bit位都会变成1(>>的特点是每次移动补上最高位,而<<<则是补0
之后异或n >> 1:对于正int来说,异或的是全0,结果相当于原来的值乘以2;对于负int来说,异或的是全1,结果相当于求反,于是值便是原来的值去掉符号位后减1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值