Varint编码

Varint编码

规则

  1. 用7个比特位存储整数的值的部分,最高位(第8位)标识是否还有后续字节。

    0表示是最后一个字节

    1表示后面还有

  2. 后续字节的每个字节的最高位都是1,其余7位存储整数的值的部分。

案例

以32为int为例

  1. 值:1

    常规编码:0000 0000 0000 0000 0000 0000 0000 0001

    Varint编码: 0000 0001

  2. 值:123456

    常规编码:111 1000100 1000000

    每次从低到高取7位再加上有效位

    取7位:1000000,加上有效位:11000000

    取7位:1000100,加上有效位:01000100

    取7位:0000111,加上有效位:00000111

    Varint编码:11000000 01000100 00000111

  3. 值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
}
posted @ 2023-08-29 23:22  INnoVation-V2  阅读(67)  评论(0编辑  收藏  举报