package sbproxy import ( "io" ) func ReadVarInt(r io.Reader) (int32, int, error) { var val int32 var size int for { var b [1]byte if _, err := r.Read(b[:]); err != nil { return 0, 0, err } d := b[0] val |= int32(d&0x7F) << (7 * size) size++ if size > 5 { return 0, 0, io.ErrUnexpectedEOF } if d&0x80 == 0 { break } } return val, size, nil } func WriteVarInt(w io.Writer, val int32) int { buf := make([]byte, 5) size := 0 for { b := byte(val & 0x7F) val >>= 7 if val != 0 { b |= 0x80 } buf[size] = b size++ if val == 0 { break } } w.Write(buf[:size]) return size } func ReadString(r io.Reader) (string, error) { length, _, err := ReadVarInt(r) if err != nil { return "", err } buf := make([]byte, length) if _, err := io.ReadFull(r, buf); err != nil { return "", err } return string(buf), nil } func WriteString(w io.Writer, s string) { WriteVarInt(w, int32(len(s))) w.Write([]byte(s)) }