用golang解析varint
#前言
解析 varint:
varint 是变长整数,如果数组中的数大小不均匀时用 varint 会比较高效。
本质上是将一个字节的低七位用于存储数据,最高一位用于标识是否该数字已结束。
比如二进制1111111 1010101 0101010
和000 11111
,如果用相同的大小存,第二个数字会用很多无用的零空间。
转化成 varint 的逻辑如下:
- 按七个比特位分割,
1111111
、1010101
、0101010
。 - 小端序,低位在前,
0101010
、1010101
、1111111
。 - 第一、二个最前面补 1,最后一个补 0,
10101010
、11010101
、01111111
。
#解码
1 | func DecodeVarint(buf []byte) (x uint64, n int) { |
解码是逆过程,取出七位的有效位数,并左移,越往后的数字 shift 的位数越多,因为编码的时候,越大的位数在整个 varint 的越后面。
直到首位是 0,代表一个数字结束,返回。
#疑问点
- 在编码的时候需要把不足的位数补回去吗?感觉是需要的,但是没找到证据= =
#最后
- 炉石的卡牌代码就是 varint+base64,之前一直用 shell 调用 python 的解析库,实在是太慢了,研究一下,一小时搞定。
- 最近优化了很多项目上的东西,比如把 shell 调用换成了 go 语言重写,之前 7 秒的一个接口请求现在估计 1 秒就渲染好了= =