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编码。所以你要清楚你使用这两个类型的意义。通常我只用来处理负整数。
分享到:
相关推荐
Protocol Buffer序列化对比Java序列化.
包含protobuf-java-2.5.0.jar、 protoc.exe 、msg.proto、Compile.bat可供生成java和c++的协议文件。使用时可修改msg.proto文件定义自己的协议格式。只需要点击Compile.bat即可生成Msg.java和msg.pb.h msg.pb.cc三个...
Protocol Buffer 2.5.0 jar包
protocolbuffer案例代码
用Java语言实现的利用Protocol Buffer进行数据保存的实例,具体的体现是一个学生记录管理。一个Demo,为了帮大家理解Protocol Buffer的。
Protocol Buffer使用
反序列化:Protocol buffers 反序列化 需要转换到16进制,一键反序列化,有问题可以私信我
Protocol Buffers被定义为一种数据描述语言(Data Description Language,DDL),广泛的应用于Google内部,用于结构化数据的描述...Protocol Buffers是一个平台中立,编程语言无关的,可扩展的机制,用来将数据序列化。
C++实例Protocol Buffer技术详解,感兴趣的朋友可以了解下
Python调用序列化数据工具Protocol Buffers——protobuf https://xercis.blog.csdn.net/article/details/109204030
Protocol Buffer文件编译成Java文件所需要的相关工具,jar包,exe编译工具等。
01 Protocol Buffer技术详解(语言规范).doc
谷歌公司开发的protocol序列化文件时使用,目前大数据hadoop中用来序列化保存数据
Android端中使用Netty+Protocol Buffer实现聊天室功能
Protocol Buffer sublime text 3插件,官方网址: https://github.com/vihangm/sublime-protobuf-syntax
Protocol_Buffer官网文档中文版
protocol buffer jar架包和Windows下的代码生成工具(protobuf-java-2.5.0.jar protoc-2.5.0-win32)
protocolbuffer技术用到的源码包及安装包