在分析Avro源码时,发现Avro为了对int、long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数)。
1. 补码编码
为了便于后面的分析,我们先回顾下几个概念:
- 原码:最高位为符号位,剩余位表示绝对值;
- 反码:除符号位外,对原码剩余位依次取反;
- 补码:对于正数,补码为其自身;对于负数,除符号位外对原码剩余位依次取反然后+1。
补码解决了原码中\(0\)存在两种编码的问题:
\[0=[0000 \enspace 0000]_原=[1000 \enspace 0000]_原 \]
补码\([1000 \enspace 0001]_补\) 表示\(-127\);此外,原码中还存在加法错误的问题:
\[1 + (-1) = [0000 \enspace 0001]_原 + [1000 \enspace 0001]_原 = [1000 \enspace 0010]原 = -2 \]
本文介绍了ZigZag编码在Avro和Protocol Buffers中的应用,用于整数压缩。首先回顾补码编码的概念,然后详细阐述ZigZag编码的原理,包括编码和解码过程,并通过Java代码展示其实现。ZigZag编码通过使小整数的编码更短来优化压缩效果,但并不适合大整数居多的情况。
订阅专栏 解锁全文
555

被折叠的 条评论
为什么被折叠?



