Skip to main content

A type-aware bitfield serializing / deserializing library for Python

Project description

bydantic

Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.

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:

---
title: "Foo Bitfield"
---
%%{init: {'theme': 'default', 'packet': { 'rowHeight': 50, 'bitWidth': 100, 'bitsPerRow': 8 }}}%%
packet-beta
0-3: "a"
4-7: "b"
8-15: "c"

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

  • Field type primitives (e.g. int_field, str_field, bytes_field, etc.)
  • Field type combinators (e.g. mapped_field, list_field, dynamic_field, etc.)
  • Clear error messages for serialization / deserialization failures, even when fields are deeply nested

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.0.2.tar.gz (21.6 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.0.2-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for bydantic-0.0.2.tar.gz
Algorithm Hash digest
SHA256 9c00d66c0a9bef30bb2a5c038d28a2c603e05f1183c74eb9d97fdb40a57424be
MD5 fb52d249e989b79d7f23c91c2c4302fc
BLAKE2b-256 e6f6539a9299d962c2025ea07a2b2a85669319c85a23152337aabe1e7d1c4a03

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.0.2.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.0.2-py3-none-any.whl.

File metadata

  • Download URL: bydantic-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 18.3 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.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8ae6eaea2aab4b85222d9d87ddf0def74851a388768fc8dbc06b39ab6ef436a8
MD5 e366391f7f3356de23a89cd2f75e1c0b
BLAKE2b-256 bffa4332fbad44a7ac7d6b3c504d603b16bc43228278c25e94e233471050432a

See more details on using hashes here.

Provenance

The following attestation bundles were made for bydantic-0.0.2-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