`
阿尔萨斯
  • 浏览: 4187117 次
社区版块
存档分类
最新评论

Protocol Buffer 四 整数序列化

 
阅读更多

varints用于正整数 (无符号整数)

varints 是 一个很不错的技术。将一个整数序列化成1或者多个字节。想起以前我们总是使用4字节表示整数,真的很浪费啊。只有真正追求完美的人才会重视每个细节。

我的本篇介绍是https://developers.google.com/protocol-buffers/docs/encoding中的Base 128 Varints一节的逆过程。这么好的站点被墙了,幸好我有VPN。



规则:

1.如果整数可以用一个字节表示,不要改变它
2.否则,用上面的4步序列化
3.每个字节最高位叫msb(most significant bit),1表示后面有字节,0表示后面没有字节。


ZigZag用于负整数(有符号的整数)

但是这种varints encoding算法用来处理负数是不合适的。因为它会把负数当作很大的正数,从而通常序列化成10字节。显然效率比较低。

遇到负数的时候,应该采用另一种encoding算法。


如果是32位符号负整数,用

(n << 1) ^ (n >> 31)

64位符号负整数,用

(n << 1) ^ (n >> 61)
注意,这些移位都是arithmetic shift,也就是左移补0,右移补符号位。


注意,当protocol buffer编译器看到你的类型是sint32或者sint64,它才会用ZigZag编码。所以你要清楚你使用这两个类型的意义。通常我只用来处理负整数。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics