...
Source file src/pkg/compress/bzip2/bit_reader.go
1
2
3
4
5 package bzip2
6
7 import (
8 "bufio"
9 "io"
10 )
11
12
13
14
15
16 type bitReader struct {
17 r io.ByteReader
18 n uint64
19 bits uint
20 err error
21 }
22
23
24
25 func newBitReader(r io.Reader) bitReader {
26 byter, ok := r.(io.ByteReader)
27 if !ok {
28 byter = bufio.NewReader(r)
29 }
30 return bitReader{r: byter}
31 }
32
33
34
35
36 func (br *bitReader) ReadBits64(bits uint) (n uint64) {
37 for bits > br.bits {
38 b, err := br.r.ReadByte()
39 if err == io.EOF {
40 err = io.ErrUnexpectedEOF
41 }
42 if err != nil {
43 br.err = err
44 return 0
45 }
46 br.n <<= 8
47 br.n |= uint64(b)
48 br.bits += 8
49 }
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 n = (br.n >> (br.bits - bits)) & ((1 << bits) - 1)
66 br.bits -= bits
67 return
68 }
69
70 func (br *bitReader) ReadBits(bits uint) (n int) {
71 n64 := br.ReadBits64(bits)
72 return int(n64)
73 }
74
75 func (br *bitReader) ReadBit() bool {
76 n := br.ReadBits(1)
77 return n != 0
78 }
79
80 func (br *bitReader) Err() error {
81 return br.err
82 }
83
View as plain text