Varint编码
Varint编码
规则
- 
用7个比特位存储整数的值的部分,最高位(第8位)标识是否还有后续字节。 0表示是最后一个字节1表示后面还有
- 
后续字节的每个字节的最高位都是1,其余7位存储整数的值的部分。 
案例
以32为int为例
- 
值:1 常规编码: 0000 0000 0000 0000 0000 0000 0000 0001Varint编码: 0000 0001
- 
值:123456 常规编码: 111 1000100 1000000每次从低到高取7位再加上有效位 取7位: 1000000,加上有效位:11000000取7位: 1000100,加上有效位:01000100取7位: 0000111,加上有效位:00000111Varint编码: 11000000 01000100 00000111
- 
值128: 二进制: 1000 0000取7位: 000 0000,加上有效位:1000 0000取7位: 000 0001,加上有效位:0000 0001Varint编码: 1000 0000 0000 0001
代码
func EncodeVarint(val uint64) []byte {
	var buf [10]byte
	var idx int
	for idx = 0; val > 127; idx++ {
		buf[idx] = 0x80 | uint8(val&0x7f)
		val >>= 7
	}
	buf[idx] = uint8(val)
	idx++
	return buf[0:idx]
}
func DecodeVarint(buf []byte) (x uint64, n int) {
	for shift := uint(0); shift < 64; shift += 7 {
		if n >= len(buf) {
			return 0, 0
		}
		b := uint64(buf[n])
		n++
		x |= (b & 0x7F) << shift
		if (b & 0x80) == 0 {
			return x, n
		}
	}
	
	return 0, 0
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号