diff --git a/bit/buf_reader.go b/bit/buf_reader.go index 437441b..806fec0 100644 --- a/bit/buf_reader.go +++ b/bit/buf_reader.go @@ -41,6 +41,16 @@ func (r *bufReader) ReadByte() byte { } func (r *bufReader) Read(buf []byte) int { + if r.bits == 0 { + if len(r.src) < len(buf) { + r.err = io.EOF + return 0 + } + copy(buf, r.src[:len(buf)]) + r.src = r.src[len(buf):] + return len(buf) + } + for i := 0; i < len(buf); i++ { b := r.ReadByte() if r.err != nil { @@ -52,9 +62,27 @@ func (r *bufReader) Read(buf []byte) int { } func (r *bufReader) DiscardBytes(n int) { - for i := 0; i < n; i++ { - r.ReadByte() + if r.bits == 0 { + if len(r.src) < n { + r.err = io.EOF + return + } + r.src = r.src[n:] + return + } + + for r.bits > 8 { + r.bits -= 8 + n -= 1 } + + if len(r.src) < n { + r.err = io.EOF + return + } + + r.n = uint64(r.src[n-1]) >> (8 - r.bits) + r.src = r.src[n:] } func (r *bufReader) Err() error { return r.err }