Varint编码
规则
-
用7个比特位存储整数的值的部分,最高位(第8位)标识是否还有后续字节。
0
表示是最后一个字节1
表示后面还有 -
后续字节的每个字节的最高位都是1,其余7位存储整数的值的部分。
案例
以32为int为例
-
值:1
常规编码:
0000 0000 0000 0000 0000 0000 0000 0001
Varint编码:
0000 0001
-
值:123456
常规编码:
111 1000100 1000000
每次从低到高取7位再加上有效位
取7位:
1000000
,加上有效位:11000000
取7位:
1000100
,加上有效位:01000100
取7位:
0000111
,加上有效位:00000111
Varint编码:
11000000 01000100 00000111
-
值128:
二进制:
1000 0000
取7位:
000 0000
,加上有效位:1000 0000
取7位:
000 0001
,加上有效位:0000 0001
Varint编码:
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
}
标签:Varint,编码,0000,idx,val,buf
From: https://www.cnblogs.com/INnoVationv2/p/17666109.html