广西新农村建设指导员网站,建立营销网络,有没有直接做网站的软件,自己装修设计软件1. Varint 编码
原理
Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字#xff0c;值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。
Varint 中的每个字节#xff08;最后一个字节除外#xff09;都设置了最高有效位#xff08;msb值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。
Varint 中的每个字节最后一个字节除外都设置了最高有效位msb这一位表示是否还会有更多字节出现。每个字节的低 7 位用于以 7 位组的形式存储数字的二进制补码表示最低有效组首位。编码方式
1将被编码数转换为二进制表示2从低位到高位按照 7位 一组进行划分3将大端序转为小端序即以分组为单位进行首尾顺序交换因为 protobuf 使用是小端序所以需要转换一下
4给每组加上最高有效位(最后一个字节高位补0其余各字节高位补1)组成编码后的数据。5最后转成 10 进制。数字123456进行 varint 编码
1123456 用二进制表示为1 11100010 01000000
2每次从低向高取 7位 变成111 1000100 1000000
3大端序转为小端序即交换字节顺序变成1000000 1000100 111
4然后加上最高有效位(即最后一个字节高位补0其余各字节高位补1)变成11000000 11000100 00000111
5最后再转成 10进制所以经过 varint 编码后 123456 占用三个字节分别为192 196 7。解码的过程就是将字节依次取出去掉最高有效位因为是小端排序所以先解码的字节要放在低位之后解码出来的二进制位继续放在之前已经解码出来的二进制的高位最后转换为10进制数完成varint编码的解码过程。
缺点
负数需要10个字节显示因为计算机定义负数的符号位为数字的最高位。
具体是先将负数是转成了 long 类型再进行 varint 编码这就是占用 10个 字节的原因了。
protobuf 采取的解决方式使用 sint32/sint64 类型表示负数通过先采用 Zigzag 编码将正数、负数和0都映射到无符号数最后再采用 varint 编码。
2. ZigZag编码
ZigZag 是将符号数统一映射到无符号号数的一种编码方案具体映射函数为
Zigzag(n) (n 1) ^ (n 31), n 为 sint32 时Zigzag(n) (n 1) ^ (n 63), n 为 sint64 时3. Message Structure 编码
protocol buffer 中 message 是一系列键值对。message 的二进制版本只是使用字段号(field’s number 和 wire_type)作为 key。
每个字段的名称和声明类型只能在解码端通过引用消息类型的定义即 .proto 文件来确定。
这一点也是人们常常说的 protocol buffer 比 JSONXML 安全一点的原因如果没有数据结构描述 .proto 文件拿到数据以后是无法解析成正常的数据的。总结
Protocol Buffer 利用 Varint 原理压缩数据同时使用Tag - Value (Tag - Length - Value)的编码结构的实现减少了分隔符的使用数据存储更加紧凑。protocol buffers 在序列化方面与 XML 相比有诸多优点更加简单
数据体积小 3- 10 倍
更快的反序列化速度提高 20 - 100 倍
可以自动化生成更易于编码方式使用的数据访问类