Bytex, like Pydantic but for binary formats

4 months ago 2

Like Pydantic, but for binary formats.

Let’s say you want to represent a user profile in your application using a compact binary format.

Start by defining the user type as a StructureEnum:

from bytex import StructureEnum from bytex.types import U8 from enum import auto class UserType(StructureEnum(U8)): """ An enum representing a UserType in a single byte. """ ADMIN = auto() MEMBER = auto() GUEST = auto()

A StructureEnum is just a subclass of Python's built-in Enum, so you can use it as you normally would.

Then define a structure for a date:

from bytex import Structure from bytex.types import U16, U8 class Date(Structure): year: U16 month: U8 day: U8

Now bring it all together into a UserProfile structure:

from bytex import Structure from bytex.length_encodings import Terminator from typing import Annotated class UserProfile(Structure): user_type: UserType joined_at: Date name: Annotated[str, Terminator("\0")]

The Annotated[str, Terminator("\0")] represents a string with a Terminator length encoding, meaning the string is serialized with a "\0" at the end, and deserialized until a "\0" is encountered (There is a pre-made type for this exact scenario called CStr located at structure.types, which is a null-terminated string).

And you're done!

You can now serialize and parse binary data with ease:

from bytex import Endianes profile = UserProfile( user_type=UserType.ADMIN, joined_at=Date(year=2024, month=6, day=25), name="admin" ) binary: bytes = profile.dump(endianes=Endianes.LITTLE) parsed: UserProfile = UserProfile.parse(binary, endianes=Endianes.LITTLE)
Read Entire Article