ZigZag编码】的更多相关文章

ZigZag编码 在网络传输和数据存储场景中,需要对数据进行压缩.数据压缩的算法非常多,但大部分的数据压缩算法的原理是通过某种编码方式不存储数据中的0比特位,因此0比特位越多,数据压缩的效果越好.ZigZag编码就是一种增加0比例位的编码方式.下面使用Java语言来描述ZigZag编码. 一.编码 正数 假设数据类型为byte的正数11,其二进制表示为:00001011 数据左移一位:00010110 符号位(正数的符号为0)放到最后一位:00010110 负数 假设数据类型为byte的负数-1…
在分析Avro源码时,发现Avro为了对int.long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数). 1. 补码编码 为了便于后面的分析,我们先回顾下几个概念: 原码:最高位为符号位,剩余位表示绝对值: 反码:除符号位外,对原码剩余位依次取反: 补码:对于正数,补码为其自身:对于负数,除符号位外对原码剩余位依次取反然后+1. 补码解决了原码中\(0\)存在两种编码的问题: \[ 0=[0000 \enspace 0000]_…
Google Protocol Buffer 使用到了两种编码方式:Varints 和 zigzag. 一 Varints 编码 每个 byte 只用 7bit 表示数字,最高位 bit作为标志位,如果为: 1,表示后续的 byte 也是该数字的一部分: 0,表示结束. 因此值越小的数字使用越少的字节数.例如小于 128 的数只需要用一个 byte 表示. 1: 0000 0001 128: 0111 1111 129: 1000 0001 0111 1111 二 Zigzag 编码 负数最高位…
LevelDB内部通过采用变长编码,对数据进行压缩来减少存储空间,采用CRC进行数据正确性校验.下面就对varint编码进行学习. 传统的integer是以32位来表示的,存储需要4个字节,当如果整数大小在256以内,那么只需要用一个字节就可以存储这个整数,这样就可以节省3个字节的存储空间,Google varint就是根据这种思想来序列化整数的 无符号 Varint 是一种紧凑的表示数字的方法.它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数.这能减少用来表示数字的字节数. Va…
Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力来自什么地方,版本兼容如何做到的,其Key-Value编码的设计思路.如果你详细了解此文,你应该就能具备自己造一套编解码轮子的能力(至少基本思路). 测试的例子 阅读图片时请对比前面的例子和表格.每个字段的名称都是包含了tag的. message S2 { optional int32 s2_1 =…
一:protobuf编码基本数据类型 public enum FieldType { DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), FLOAT (JavaType.FLOAT , WIRETYPE_FIXED32 ), INT64 (JavaType.LONG , WIRETYPE_VARINT ), UINT64 (JavaType.LONG , WIRETYPE_VARINT ), INT32 (JavaType.INT , WIRETYPE_V…
protocol buffers使用二进制传输格式传递消息,因此相比于xml,json来说要轻便很多. 示例:假设定义了一个Message message Test1 { required int32 a = ; } 实际使用的时候将a设置为150,然后将其序列化到输出流,查看编码后的message,可以看到如下3个byte 解析: 上述三个字节实际分为两部分: 08  96 01.第一部分(08)包含了message成员变量的field number(a=1)和变量类型(Varint),第二部…
 proto2 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列化结构数据格式. 字段规则 required: 字段必须存在 optional: 字段没有或有一个 repeated: 字段重复,0个或多个 proto 数据类型 .proto Type Notes C++ Type Java Type Python Type[2] Go Type…
本文档描述了协议缓冲消息的二进制格式.在应用程序中使用Protocol Buffer不需要理解这一点,但是了解不同的Protocol Buffer格式如何影响编码消息的大小会非常有用. 一条简单的信息 假设您有以下非常简单的消息定义: message Test1 {   optional int32 a = 1; } 在应用程序中,您创建一个Test1消息,并将设置为150.然后将消息序列化为输出流.如果您能够检查编码的消息,您会看到三个字节: 08 96 01 到目前为止,数字如此之小——但这…
本文介绍protocol buffer消息二进制传输格式.在应用程序中使用protocol buffer时,你并不需要了解这些,但它对你了解protocol buffer格式如何影响你的编码消息的大小很有用. 简单消息 我们从一个非常简单的消息定义开始: message Test1 { int32 a = 1; } 在程序中,你可以创建一个Test1,然后设置a为150.之后你讲消息序列化到一个输出流.如果你想检查编码的消息,你会看到三个字节: 08 96 01 那么,这些数字代表什么呢?接着往…