From a08480e8cd5df93a953323b400914520d5963660 Mon Sep 17 00:00:00 2001 From: BiSaXa <1669855+BiSaXa@users.noreply.github.com> Date: Sun, 4 Sep 2022 14:53:07 +0300 Subject: added skipbytes, 64 bit support for readbits, new readme --- README.md | 37 +++++++++++++++++++++++++++++++++++++ bitreader.go | 26 +++++++++++++++++++------- bitreader_test.go | 13 ++++++++----- 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a493a1f..4f28e7b 100644 --- a/README.md +++ b/README.md @@ -1 +1,38 @@ # BitReader +A simple bit reader with big/little-endian support for golang.\ +Reads data from an existing byte array.\ +Uses string manipulation (for now).\ +Support reading up to 64 bits at one time.\ +Checking for overflowing the data. + +## Installation +```bash +$ go get github.com/bisaxa/bitreader +``` + +## Usage + +```go +import "github.com/bisaxa/bitreader" + +// data: []byte Data to read from byte array +// le: bool Little-endian(true) or big-endian(false) state +reader := bitreader.Reader(data, le) + +// read first bit +state, err := reader.ReadBit() + +// skip bits/bytes +err := reader.SkipBits(8) +err := reader.SkipBytes(4) + +// read bits +value, err := reader.ReadBits(11) +value, err := reader.ReadBits(64) // up to 64 bits +``` + +## Error Handling +ReadBits(x), ReadBit(), SkipBits(x) and SkipBytes(x) functions returns an error message when they don't work as expected. It is advised to always handle errors. + +## License +This project is licensed under [MIT License](LICENSE). \ No newline at end of file diff --git a/bitreader.go b/bitreader.go index b105df7..635776b 100644 --- a/bitreader.go +++ b/bitreader.go @@ -33,6 +33,10 @@ func (reader *ReaderType) SkipBits(bits int) error { if bits <= 0 { return fmt.Errorf("SkipBits Error: Bits value %d lower or equals than 0.", bits) } + err := reader.checkAvailableBits(bits) + if err != nil { + return err + } for reader.index+bits > 7 { reader.base++ reader.index = 0 @@ -42,12 +46,20 @@ func (reader *ReaderType) SkipBits(bits int) error { return nil } -func (reader *ReaderType) ReadBits32(bits int) (int, error) { +func (reader *ReaderType) SkipBytes(bytes int) error { + err := reader.SkipBits(bytes * 8) + if err != nil { + return err + } + return nil +} + +func (reader *ReaderType) ReadBits(bits int) (int, error) { if bits <= 0 { return -1, fmt.Errorf("ReadBits Error: Bits value %d lower or equals than 0.", bits) } - if bits > 32 { - return -1, fmt.Errorf("ReadBits Error: Bits value %d higher than 32.", bits) + if bits > 64 { + return -1, fmt.Errorf("ReadBits Error: Bits value %d higher than 64.", bits) } err := reader.checkAvailableBits(bits) if err != nil { @@ -79,7 +91,7 @@ func (reader *ReaderType) ReadBits32(bits int) (int, error) { reader.index -= 8 } // Conversion of string binary to int - value, err := strconv.ParseUint(output, 2, 32) + value, err := strconv.ParseUint(output, 2, 64) if err != nil { return -1, fmt.Errorf("%s", err) } @@ -97,7 +109,7 @@ func (reader *ReaderType) ReadBits32(bits int) (int, error) { } } // Conversion of string binary to int - value, err := strconv.ParseUint(output, 2, 32) + value, err := strconv.ParseUint(output, 2, 64) if err != nil { return -1, fmt.Errorf("%s", err) } @@ -106,7 +118,7 @@ func (reader *ReaderType) ReadBits32(bits int) (int, error) { } func (reader *ReaderType) ReadBit() (bool, error) { - value, err := reader.ReadBits32(1) + value, err := reader.ReadBits(1) if err != nil { return false, fmt.Errorf("ReadBit Error: %s", err) } @@ -116,7 +128,7 @@ func (reader *ReaderType) ReadBit() (bool, error) { func (reader *ReaderType) checkAvailableBits(bits int) error { availableBits := (len(reader.data)-reader.base)*8 - reader.index if availableBits < bits { - return fmt.Errorf("BitReaderOutOfBounds: Wanted to read %d bit(s) but only %d bit(s) is/are available.", bits, availableBits) + return fmt.Errorf("BitReaderOutOfBounds: Wanted to read/skip %d bit(s) but only %d bit(s) is/are available.", bits, availableBits) } return nil } diff --git a/bitreader_test.go b/bitreader_test.go index aed0930..ef421a8 100644 --- a/bitreader_test.go +++ b/bitreader_test.go @@ -47,7 +47,7 @@ func TestReadBits32(t *testing.T) { if err != nil { t.Fatal(err) } - value, err := bitreader.ReadBits32(32) + value, err := bitreader.ReadBits(32) if err != nil { t.Fatal(err) } @@ -57,12 +57,12 @@ func TestReadBits32(t *testing.T) { } } -func TestReadBits32LSB(t *testing.T) { +func TestReadBitsLE(t *testing.T) { bitreader := Reader(TestArray[:], true) expected := []int{1720, 1768} // 11010111000, 11011101000 for i := range expected { bitreader.ReadBit() - value, err := bitreader.ReadBits32(32) + value, err := bitreader.ReadBits(32) if err != nil { t.Fatal(err) } @@ -75,7 +75,10 @@ func TestReadBits32LSB(t *testing.T) { func TestSkipBits(t *testing.T) { bitreader := Reader(TestArray[:], false) expected := []bool{true, true, false, true} //00001101 - bitreader.SkipBits(12) + err := bitreader.SkipBits(12) + if err != nil { + t.Fatal(err) + } for i := range expected { value, err := bitreader.ReadBit() if err != nil { @@ -87,7 +90,7 @@ func TestSkipBits(t *testing.T) { } } -func TestSkipBitsLSB(t *testing.T) { +func TestSkipBitsLE(t *testing.T) { bitreader := Reader(TestArray[:], true) expected := []bool{false, false, false, false} //10110000 bitreader.SkipBits(12) -- cgit v1.2.3