package wire import ( "errors" "io" ) // VarIntMaxBytes is the maximum encoded length of a Minecraft VarInt. const VarIntMaxBytes = 5 var errVarIntTooBig = errors.New("wire: VarInt exceeds 5 bytes") // ReadVarInt reads a Minecraft-style VarInt from a byte reader. func ReadVarInt(r io.ByteReader) (int, error) { var value, shift int for { b, err := r.ReadByte() if err != nil { return 0, err } value |= int(b&0x7F) << shift if b&0x80 == 0 { return value, nil } shift += 7 if shift >= 32 { return 0, errVarIntTooBig } } } // AppendVarInt appends v encoded as a VarInt to dst. func AppendVarInt(dst []byte, v int) []byte { u := uint32(v) for u&^uint32(0x7F) != 0 { dst = append(dst, byte(u&0x7F)|0x80) u >>= 7 } return append(dst, byte(u)) } // VarIntSize returns the encoded byte length of v. func VarIntSize(v int) int { n := 1 u := uint32(v) for u&^uint32(0x7F) != 0 { u >>= 7 n++ } return n }