Skip to main content

A type-aware bitfield serializing / deserializing library for Python

Project description

bydantic

Project Status: Active – The project has reached a stable, usable state and is being actively developed. PyPI - Version PyPI - Downloads

bydantic is a Python library for serializing and deserializing bitfields. bydantic allows you to declaratively define bitfields as Python classes with type hints, which then can be automatically serialized and deserialized to and from raw bytes.

The name bydantic is a portmanteau of "bit" and "pydantic" -- just as pydantic gives developers a way to declaratively define data models with type hints and then serialize and deserialize raw objects against those models, bydantic gives developers a way to do the same with bitfields.

Installation

bydantic is available on PyPI and can be installed using pip:

pip install bydantic

Note: Consider the current version as somewhat of a developer preview. bydantic is still under active development, and the API is still not quite settled.

Quick Start

Here's a simple example of how bydantic can be used:

import bydantic as bd

class Foo(bd.Bitfield):
    a: int = bd.uint_field(4)
    b: int = bd.uint_field(4)
    c: str = bd.str_field(n_bytes=1)

This defines a bitfield with three fields: a and b are 4-bit unsigned integers, and c is a 1-byte (8-bit) string:

Bitfield Diagram

You can then serialize and deserialize instances of Foo to and from raw bytes:

foo = Foo(a=1, b=2, c="x")

# Serialize to bytes
print(foo.to_bytes()) # b'\x12x'

# Deserialize from bytes
foo2 = Foo.from_bytes_exact(b'\x34y')
print(foo2) # Foo(a=3, b=4, c='y')

The power of bydantic, however, is that field types can be composed into complex data structures. For example:

from __future__ import annotations
import bydantic as bd

class Foo(bd.Bitfield):
    a: int = bd.uint_field(4)
    b: int = bd.uint_field(4)
    c: str = bd.str_field(n_bytes=1)


def discriminator(b: Bar):
    return bd.int_field(8) if b.d[0].a == 0 else bd.str_field(n_bytes=1)

class Bar(bd.Bitfield):
    d: list[Foo] = bd.list_field(Foo, n_items = 2)
    e: int | str = bd.dynamic_field(discriminator)

bar = Bar(d=[Foo(a=0, b=1, c="x"), Foo(a=2, b=3, c="y")], e=42)

# Serialize to bytes
print(bar.to_bytes()) # b'\x01x#y*'

# Deserialize from bytes
bar2 = Bar.from_bytes_exact(b'\x01x#y*')
print(bar2) # Bar(d=[Foo(a=0, b=1, c='x'), Foo(a=2, b=3, c='y')], e=42)

This just scratches the surface of what bydantic can do... continue reading the docs for more info.

Features

Related Projects

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

bydantic-0.1.0.tar.gz (21.1 kB view details)

Uploaded Source

Built Distribution

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

bydantic-0.1.0-py3-none-any.whl (17.9 kB view details)

Uploaded Python 3

File details

Details for the file bydantic-0.1.0.tar.gz.

File metadata

  • Download URL: bydantic-0.1.0.tar.gz
  • Upload date:
  • Size: 21.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bydantic-0.1.0.tar.gz
Algorithm Hash digest
SHA256 109742d3018048860e97393453cac079f52422417c15f75202917ada029ffbc0
MD5 5ac3917d712ffbbb81db8c390ae940e3
BLAKE2b-256 f2ebf78508b3db863e06a7657416122215182c1f51d61e547414ea176abdacc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.1.0.tar.gz:

Publisher: publish-release.yml on khusmann/bydantic

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

File details

Details for the file bydantic-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: bydantic-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 17.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for bydantic-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c895f75a0a2f2d6342fffd013877943f90314d778b2e44e32d30b7a6f2b5f4f1
MD5 7ada5041a34c587ae6d6899dbb7daa89
BLAKE2b-256 40321e66493b3f1945e9ce4b2ce2cf7d7dcc9163c9c544a3ac3eb70aab99943b

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.1.0-py3-none-any.whl:

Publisher: publish-release.yml on khusmann/bydantic

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