68 lines
1023 B
Go
68 lines
1023 B
Go
package bits
|
|
|
|
type Reader struct {
|
|
buf []byte // packets buffer
|
|
byte byte
|
|
bits byte
|
|
pos int
|
|
}
|
|
|
|
func NewReader(b []byte) *Reader {
|
|
return &Reader{buf: b}
|
|
}
|
|
|
|
//goland:noinspection GoStandardMethods
|
|
func (r *Reader) ReadByte() byte {
|
|
if r.bits == 0 {
|
|
b := r.buf[r.pos]
|
|
r.pos++
|
|
return b
|
|
}
|
|
|
|
return r.ReadBits8(8)
|
|
}
|
|
|
|
func (r *Reader) ReadBit() byte {
|
|
if r.bits == 0 {
|
|
r.byte = r.ReadByte()
|
|
r.bits = 7
|
|
} else {
|
|
r.bits--
|
|
}
|
|
|
|
return (r.byte >> r.bits) & 0b1
|
|
}
|
|
|
|
func (r *Reader) ReadBits(n byte) (res uint32) {
|
|
for i := n - 1; i != 255; i-- {
|
|
res |= uint32(r.ReadBit()) << i
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *Reader) ReadBits8(n byte) (res uint8) {
|
|
for i := n - 1; i != 255; i-- {
|
|
res |= r.ReadBit() << i
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *Reader) ReadBits16(n byte) (res uint16) {
|
|
for i := n - 1; i != 255; i-- {
|
|
res |= uint16(r.ReadBit()) << i
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *Reader) SkipBits(n int) {
|
|
for i := 0; i < n; i++ {
|
|
if r.bits == 0 {
|
|
r.byte = r.buf[r.pos]
|
|
r.pos++
|
|
r.bits = 7
|
|
} else {
|
|
r.bits--
|
|
}
|
|
}
|
|
}
|