文档介绍:数据压缩算法
varint(数字)
数字压缩算法
算法逻辑:每个字节的首bit代表是否还需要下一位(0表示不需要,1表示需要),每个字节的可用位为7位
优点:对于int类型数值较小的数起到压缩作用,比如,数据压缩算法
varint(数字)
数字压缩算法
算法逻辑:每个字节的首bit代表是否还需要下一位(0表示不需要,1表示需要),每个字节的可用位为7位
优点:对于int类型数值较小的数起到压缩作用,比如,2的(3*7)次方以下的数字都能起到压缩作用,由于实际传输过程中,我们大多用到的都是小类型的int数值,故这种方法能起到压缩字符的作用。
缺点:
对于数值较大的数字,比如int类型,2的(4*7)次方以上的数字是需要5个字节来表示。
对于负值,如-1,本质上首位为1导致数极大,必须要5个字节才能表示。
(java)
32位加密算法:
staticvoidwrite32ForVarint(intvalue,byte[]buffer,intposition"
while(true){
if((value&~0x7F)==0){buffer[position++]=(byte)value;return;
}else{buffer[position++]=(byte)((value&0x7F)|0x80);//|0x80代表首位bit置1value>>>=7;
}
}
}
32位解密算法:
staticintread32ForVarint(byte[]buffer,intposition){
intresult=0;
for(intshift=0;shift<32;shift+=7){/这个32可以写29反正只要大于或等于28就行。finalbyteb=buffer[position++];
result|=(long)(b&0x7F)<<shift;
if((b&0x80)==0){
returnresult;
}
}
return-1;
}
zigzag(数字)
数字压缩算法
由于表示负数时,varint花费的字节太大,所以需要一种弥补办法,来解决这种冲突!由于考虑到varint之所以表示负数占用字节大,主要因为负数表示方法是首位且为1,而varint—般从末尾向前压缩,所以varint压缩负数通常很大,基于这种考虑,我们想到当数字为负数时,将首位挪到尾位,并按位取反把1全部变为0。最后在按照varint压缩字节,这样就能够使得我们可以用少量的字节表示值小的负数。
优点:相较于varint,能够用少量字节表示负数。
缺点:对于数值大的的正数或特别小的负数仍然需要大很多的字节数,且解析相较于varint需要更多逻辑。
(java)
编码:先转换int,然后在带入varint编码
staticinttransform32ForZigzag(intnum){
return(num<<1)八(num>>31);/看清楚"A"在java代表抑或的意思}
解码:先用varint解码,然后转换int
-8变长方案