Skip to main content

A fast and lightweight bit-level mutation library for Python.

Project description

bitbuf

A fast and lightweight bit-level mutation library for Python.

Notice: bitbuf is currently a beta proof of concept. The public API is still settling, and performance is not fully optimized yet. A future version is expected to optimize the internal implementation with a native programming language backend.

Installation

pip install bitbuf

Quick Start

from bitbuf import bitbuf

buf = bitbuf.from_bytes(b"\x34\x12")

buf[4:12] = 0xAB
buf <<= 3
buf.append_msb(0b1010, 4)

value = int(buf)
payload = bytes(buf)

Bit position 0 is the least significant bit. Byte conversion always uses little-endian order.

Examples

Create Buffers

from bitbuf import bitbuf

empty = bitbuf()
fixed = bitbuf(0b1010_0101, 8)
from_int = bitbuf.from_int(0x1234, size=16)
from_bytes = bitbuf.from_bytes(b"\x34\x12")
zeros = bitbuf.zeros(16)
ones = bitbuf.ones(8)

Read and Write Bits

buf = bitbuf(0b1010_0101, 8)

lowest = buf[0]      # 1
highest = buf[-1]    # 1
buf[1] = 1           # set bit 1
buf.set_bit(7, 0)    # clear bit 7

Read and Write Bit Ranges

Slices use [start:stop], where start is the LSB-first bit position and stop - start is the width.

buf = bitbuf(0x1234, 16)

field = buf[4:12]
field_bytes = buf.get_bits_as_bytes(4, 8)
field_bytearray = buf.get_bits_as_bytearray(4, 8)
field_slice = buf.slice(4, 8) # return a slice as bitbuf
buf[4:12] = 0xAB

same_field = buf.get_bits(4, 8)
buf.set_bits(0, 0b1111, 4)

Set or Clear Ranges

buf = bitbuf(0, 8)

buf.set_ones(2, 4)   # 0b0011_1100
buf.set_zeros(3, 2)  # 0b0010_0100

Shift In Place

All operations mutate the current buffer.

buf = bitbuf(0b0000_1111, 8)

buf <<= 2            # same as buf.lshift(2)
buf >>= 1            # same as buf.rshift(1)

Append and Delete Bits

buf = bitbuf(0b0011, 4)

buf.append_high(0b101, 3)  # 0b101_0011
buf.append_low(0b10, 2)    # 0b1010011_10

buf.delete_low(2)           # discard low bits
high = buf.pop_high(3)      # remove and return high bits

Replace or Clear Contents

buf = bitbuf(0x1234, 16)

buf.assign(0xAB, 8).toggle() # assign and then flips all 8 bits
buf.clear()          # keeps len(buf) == 8

Convert Back to Python Types

buf = bitbuf.from_bytes(b"\x34\x12")

as_int = int(buf)
as_bytes = bytes(buf)
as_bytearray = buf.bytearray()
as_hex = hex(buf)

assert as_int == buf.int()
assert as_bytes == buf.bytes()
assert as_bytearray == bytearray(as_bytes)
assert as_hex == buf.hex()

API Reference

InputTypes: TypeAlias = int | bytes | bytearray | memoryview | bitbuf

class bitbuf:
    def __init__(self, value: InputTypes = 0, width: int | None = None): ...
    # Create a mutable LSB-first buffer from an int, bytes-like object, or bitbuf.

    @classmethod
    def zeros(cls, width: int) -> bitbuf: ...
    # Build a zero-filled buffer with the requested width.
    @classmethod
    def ones(cls, width: int) -> bitbuf: ...
    # Build a one-filled buffer with the requested width.
    @classmethod
    def from_buffer(cls, buffer: InputTypes, offset: int, size: int) -> bitbuf: ...
    # Build a buffer from a bit range in a bytes-like source.

    def __eq__(self, other): ...
    # Check if bitbuf object is the same as another.
    def __len__(self) -> int: ...
    # Return width in bits.
    def __int__(self) -> int: ...
    # Convert the buffer to an integer.
    def __index__(self) -> int: ...
    # Allow numeric helpers such as hex(buf).
    def __bytes__(self) -> bytes: ...
    # Convert the buffer to little-endian bytes.
    def __repr__(self) -> str: ...
    # Return a concise debug representation with width and hex data.
    def __getitem__(self, key: int | slice) -> int: ...
    # Read one bit or an integer-valued bit range.
    def __setitem__(self, key: int | slice, value: InputTypes) -> None: ...
    # Write one bit or replace a bit range.
    def __iadd__(self, value: bytes | bytearray | bitbuf) -> bitbuf: ...
    # In-place append sized value to the high side.
    def __ilshift__(self, bits: int) -> Self: ...
    # Shift left in place.
    def __irshift__(self, bits: int) -> Self: ...
    # Shift right in place.

    def assign(self, value: InputTypes = 0, width: int | None = None) -> Self: ...
    # Replace the entire buffer contents and width.
    def resize(self, width: int) -> Self: ...
    # Change width, trimming discarded high bits when shrinking.
    def clear(self) -> Self: ...
    # Zero all bits while keeping the current width.
    def clone(self) -> Self: ...
    # Create a new bitbuf with copied data.

    def get_bit(self, pos: int) -> int: ...
    # Return one bit at the given LSB-first position.
    def get_bits(self, pos: int, width: int) -> int: ...
    # Return a bit range as an integer.
    def get_bits_as_bytes(self, pos: int, width: int) -> bytes: ...
    # Return a bit range as little-endian bytes.
    def get_bits_as_bytearray(self, pos: int, width: int) -> bytearray: ...
    # Return a bit range as little-endian bytearray.
    def slice(self, pos: int, width: int) -> bitbuf: ...
    # Return a bit range as a new bitbuf.

    def clear_bit(self, pos: int) -> Self: ...
    # Clear one bit.
    def set_bit(self, pos: int, value: int = 1) -> Self: ...
    # Set or clear one bit.
    def set_bits(self, pos: int, value: InputTypes = 0, width: int | None = None) -> Self: ...
    # Replace a bit range with a sized value.
    def set_ones(self, pos: int, width: int) -> Self: ...
    # Fill a bit range with ones.
    def set_zeros(self, pos: int, width: int) -> Self: ...
    # Fill a bit range with zeros.
    def toggle(self, pos: int = 0, width: int | None = None) -> Self: ...
    # Flip all bits from pos upward, or a specific range when width is given.

    def lshift(self, bits: int) -> Self: ...
    # Shift bits toward the high side while preserving width.
    def rshift(self, bits: int) -> Self: ...
    # Shift bits toward the low side while preserving width.

    def append_low(self, value: InputTypes = 0, width: int | None = None) -> Self: ...
    # Grow the buffer by appending bits on the low side.
    def append_high(self, value: InputTypes = 0, width: int | None = None) -> Self: ...
    # Grow the buffer by appending bits on the high side.
    def delete_low(self, width: int) -> Self: ...
    # Discard low-side bits without returning them.
    def delete_high(self, width: int) -> Self: ...
    # Discard high-side bits without returning them.
    def pop_low(self, width: int) -> int: ...
    # Remove and return low-side bits.
    def pop_high(self, width: int) -> int: ...
    # Remove and return high-side bits.

    def bytearray(self) -> bytearray: ...
    # Return the whole buffer as little-endian bytearray.
    def bytes(self) -> bytes: ...
    # Return the whole buffer as little-endian bytes.
    def hex(self) -> str: ...
    # Return hex(self.int()).
    def int(self) -> int: ...
    # Return the whole buffer as an integer.

    @property
    def width(self) -> int: ...
    # Width of the buffer in bits.
    @property
    def nbytes(self) -> int: ...
    # Minimum byte count needed to store the buffer width.

Development

python -m pip install -e ".[test]"
python -m pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bitbuf-0.3.0.tar.gz (35.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

bitbuf-0.3.0-cp314-cp314-win_amd64.whl (270.5 kB view details)

Uploaded CPython 3.14Windows x86-64

bitbuf-0.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (88.4 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

bitbuf-0.3.0-cp313-cp313-win_amd64.whl (262.4 kB view details)

Uploaded CPython 3.13Windows x86-64

bitbuf-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (88.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

bitbuf-0.3.0-cp312-cp312-win_amd64.whl (263.1 kB view details)

Uploaded CPython 3.12Windows x86-64

bitbuf-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (88.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

bitbuf-0.3.0-cp311-cp311-win_amd64.whl (264.4 kB view details)

Uploaded CPython 3.11Windows x86-64

bitbuf-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (92.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

bitbuf-0.3.0-cp310-cp310-win_amd64.whl (264.1 kB view details)

Uploaded CPython 3.10Windows x86-64

bitbuf-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (92.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

File details

Details for the file bitbuf-0.3.0.tar.gz.

File metadata

  • Download URL: bitbuf-0.3.0.tar.gz
  • Upload date:
  • Size: 35.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1ab9b811c6a06c996c90cb50155e01a1a95fe8a2275b81dc3dd234c961677c03
MD5 399fedcd940730e9c48f8eb13e22e729
BLAKE2b-256 50a91068ee5c251a3f99b8d76c7de4558f7aa1cfe9f1a5fe34ef6d31256e1f44

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0.tar.gz:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: bitbuf-0.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 270.5 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 affaa49a913027715f3140c4057a395f9119878893d0d5def6c95b0218f11f19
MD5 6dd1ba18238cb6252d8362258a184de7
BLAKE2b-256 aa20d9f79cd6a3e1841804c7e45a05a7bc50ebcb58c1bead47e99be4f288c6b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp314-cp314-win_amd64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbuf-0.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 79cb37409da240496eb7f85cc9101ca6cf3f350ccc717513a99f105f9186ca5e
MD5 9d5a89e09e80fb2f4c48a6ae8fcf74bb
BLAKE2b-256 e438ae8bb0e6ef186749a48db3181c145014e9092286ea577ca3a967fff3ac5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: bitbuf-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 262.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f79970476c2893bff1b19afd9c67dc72685cb899c6c32feb7dfbc9df24e05ba3
MD5 41975b7f0a353603782067e329fb4259
BLAKE2b-256 4ddc80cc234773db09d9dbc519a3de257129a7d54273b67407b70b06cb12e87f

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbuf-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5260f61cb2d1c51d68dd752bf18b84f5c641e0efaabaa988dc286ada9bfee82b
MD5 2116ca0d1dfbd20642458822821dc3e4
BLAKE2b-256 bf9cc93ce80d25871691a9b6af424c7ef103aa42095f854434a2bc072ace7ea4

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bitbuf-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 263.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cfab74efebebc3abc3c66af4df9a73fe363c934eaca1899e820ff7d729d851f5
MD5 cabd5b4934309541978bcbf51d149b77
BLAKE2b-256 f536e93821d420cb3d13df40d7ff1ba2ca113481a43e344a45426fa7db5960a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbuf-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a6c1f950ddfa9a284b05c23cfdb5677eaa9a79e6f9fa024880e0ade14e54375
MD5 51b7b75f16cf31e9c100a5e947a7dd7a
BLAKE2b-256 a3edea27ca8a14a92863a6cada23d429e64767a6d01d7439f16cef0ab568b6c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: bitbuf-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 264.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 30868741ad8b48fe71936fc1e64ac2a678fa0894d4d0024839ad9e130b416b5c
MD5 71a5443183edf8d57eee04ec21165da2
BLAKE2b-256 95fc1fae6fbc163b03707fd2d6738ee725ec4b2f1d69ab7a38078804d3f0882a

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbuf-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c50f7db2162d5d6f24f242d0567450c6a6356b8c2cb49daf14e7f09f5494875e
MD5 30694de9cf8d21df368451a9ff559e15
BLAKE2b-256 1b50b29f4385a9af38b2f220025317a72c2dd5ff286da61eb6cc00c983aa6199

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: bitbuf-0.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 264.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for bitbuf-0.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ba60427c6a69a3313e063908aceb7a9253c1872320ffe08c541b1362a1803ba6
MD5 85a6cfbceaefdd879fde8e79d8b6e499
BLAKE2b-256 a78a84a8b3a2655e8f0e2f8604828c8950e2f78c7fd531e5328f0bb3add6193c

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bitbuf-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bitbuf-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c1587e9e4ba1cccc8e063e7c74d399b7f9661066f58ea80dfc9ec160b408c4bf
MD5 f9882d279d26f57c45fa063ab7bb6dc4
BLAKE2b-256 ec11ff6a07dd93d688b01560e02eda86e4a095d10f153514cef1266fe58609d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for bitbuf-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on donlon/bitbuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page