From de6bbef97fce344102e713f60b327ab6ad33c172 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sun, 13 Jan 2019 19:02:49 -0800 Subject: [PATCH] work on bitreader --- streaming/bitreader.go | 47 +++++++++++++++++++++++++++++++++++++ streaming/streaming_test.go | 7 ++++++ 2 files changed, 54 insertions(+) create mode 100644 streaming/bitreader.go create mode 100644 streaming/streaming_test.go diff --git a/streaming/bitreader.go b/streaming/bitreader.go new file mode 100644 index 0000000..4ea80a2 --- /dev/null +++ b/streaming/bitreader.go @@ -0,0 +1,47 @@ +package streaming + +import ( + "errors" + "io" +) + +type BitReader struct { + reader io.Reader + offset int + buffer [1]byte +} + +func New(reader io.Reader) *BitReader { + return &BitReader{reader: reader} +} + +func (r *BitReader) ReadBits(count int) (uint64, error) { + if count > 64 { + return 0, errors.New("cannot read more than 64 bits at a time") + } + + var value uint64 + for count > 0 { + bitOffset := r.offset % 8 + bitsLeft := 8 - bitOffset + if bitsLeft == 8 { + if _, err := r.reader.Read(r.buffer[:]); err != nil { + return 0, err + } + } + + bitsRead := count + if bitsRead > bitsLeft { + bitsRead = bitsLeft + } + + buffer := r.buffer[0] + buffer <<= uint(bitOffset) + buffer >>= (uint(bitOffset) + uint(bitsLeft-bitsRead)) + + value <<= uint(bitsRead) + value |= uint64(buffer) + } + + return value, nil +} diff --git a/streaming/streaming_test.go b/streaming/streaming_test.go new file mode 100644 index 0000000..9c23bce --- /dev/null +++ b/streaming/streaming_test.go @@ -0,0 +1,7 @@ +package streaming + +import "testing" + +func TestBitReader(t *testing.T) { + +}