| import struct | |
| # varint编码 -> bytes | |
| def _varint_encode(num): | |
| res = b'' | |
| while num > 127: | |
| res += struct.pack('B', 0x80 | (num & 0x7f)) | |
| num >>= 7 | |
| res += struct.pack('B', num) | |
| return res | |
| # varint解码 -> num, length | |
| def _varint_decode(bs): | |
| res = 0 | |
| n = 0 | |
| for shift in range(0, 64, 7): | |
| if n > len(bs) - 1: | |
| break | |
| res |= (bs[n] & 0x7f) << shift | |
| if (bs[n] & 0x80) == 0: | |
| break | |
| n += 1 | |
| return res, n + 1 | |