package variablelengthquantity import ( "bytes" "io" ) func decodeVarint(r io.ByteReader) (uint32, error) { var i uint32 for { b, err := r.ReadByte() if err != nil { return 0, err } i = (i << 7) | uint32(b&0x7f) if b&0x80 == 0 { return i, nil } } } func DecodeVarint(b []byte) ([]uint32, error) { var ret []uint32 r := bytes.NewReader(b) for r.Len() > 0 { u, err := decodeVarint(r) if err != nil { return nil, err } ret = append(ret, u) } return ret, nil } func encodeVarint(w io.ByteWriter, u uint32) { if u == 0 { w.WriteByte(0) return } var l int for i := u; i > 0; i >>= 7 { l++ } for i := l - 1; i >= 0; i-- { o := byte(u >> uint(i*7) & 0x7f) if i != 0 { o |= 0x80 } w.WriteByte(o) } } func EncodeVarint(u []uint32) []byte { w := new(bytes.Buffer) for _, v := range u { encodeVarint(w, v) } return w.Bytes() }