Skip to content

bearmini/bitstream-go

Repository files navigation

bitstream-go

A practical, high-performance, and easy-to-use bit stream reader/writer for golang.

  • Type aware (you don't need type castings to fit into your type)
  • Endianess aware (Little endian support is still work in progress)

Usage

Reader

package main

import (
	"bytes"
	"fmt"
	"log"

	"github.com/bearmini/bitstream-go"
)

func main() {
	// binary expression:
	// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
	data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}

	// Reader
	r := bitstream.NewReader(bytes.NewReader(data), nil)

	// read a single bit
	bit0, err := r.ReadBit()
	if err != nil {
		log.Fatalf("%+v", err)
	}
	fmt.Printf("bit: %1b\n", bit0)

	// read 2 bits
	bit1to2, err := r.ReadNBitsAsUint8(2)
	if err != nil {
		log.Fatalf("%+v", err)
	}
	fmt.Printf("bits: %02b\n", bit1to2)

	// read 10 bits as big endian
	bit3to12, err := r.ReadNBitsAsUint16BE(10)
	if err != nil {
		log.Fatalf("%+v", err)
	}
	fmt.Printf("bits: %010b\n", bit3to12)

	// read 20 bits as big endian
	bit13to32, err := r.ReadNBitsAsUint32BE(20)
	if err != nil {
		log.Fatalf("%+v", err)
	}
	fmt.Printf("bits: %020b\n", bit13to32)

	// Output:
	// bit: 0
	// bits: 00
	// bits: 0000100100
	// bits: 01101000101011001111
}

Writer

package main

import (
	"bytes"
	"encoding/hex"
	"fmt"
	"log"

	"github.com/bearmini/bitstream-go"
)

func main() {
	dst := bytes.NewBuffer([]byte{})

	// Writer
	w := bitstream.NewWriter(dst)

	// Write a single bit `1`
	err := w.WriteBit(1)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	// Write a bool value as a bit (true: 1, false: 0)
	err = w.WriteBool(false)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	// Write 2 bits `10`
	err = w.WriteNBitsOfUint8(2, 0x02)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	// Write 8 bits `0101 0011`
	err = w.WriteUint8(0x53)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	// Write 10 bits `11 0010 1101`
	err = w.WriteNBitsOfUint16BE(10, 0x032d)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	// Write 16 bits `0000 1111 0101 1010`
	err = w.WriteUint16BE(0x0f5a)
	if err != nil {
		log.Fatalf("%+v", err)
	}

	w.Flush()

	// we have written the following bits:
	// 1
	//  0
	//   10
	//      0101 0011
	//                1100 1011 01
	//                            00 0011 1101 0110 10
	// 1010 0101 0011 1100 1011 0100 0011 1101 0110 10xx

	fmt.Printf("%s", hex.EncodeToString(dst.Bytes()))
	// Output:
	// a53cb43d68
}

About

Bit stream reader/writer for golang

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages