Parse your binary structs into dataclasses
Project description
Parse your binary data into dataclasses. Pack your dataclasses into binary data.
construct-classes
rely on construct for parsing and packing. The
programmer needs to manually write the Construct expressions. There is also no type
verification, so it is the programmer’s responsibility that the dataclass and the
Construct expression match.
For fully type annotated experience, install construct-typing.
This package typechecks with mypy and pyright.
Usage
Any child of Struct
is a Python dataclass. It expects a Construct Struct
expression in the SUBCON
attribute. The names of the attributes of the dataclass
must match the names of the fields in the Construct struct.
import construct as c
from construct_classes import Struct, subcon
class BasicStruct(Struct):
x: int
y: int
description: str
SUBCON = c.Struct(
"x" / c.Int32ul,
"y" / c.Int32ul,
"description" / c.PascalString(c.Int8ul, "utf8"),
)
data = b"\x01\x00\x00\x00\x02\x00\x00\x00\x05hello"
parsed = BasicStruct.parse(data)
print(parsed) # BasicStruct(x=1, y=2, description='hello')
new_data = BasicStruct(x=100, y=200, description="world")
print(new_data.build()) # b'\x64\x00\x00\x00\xc8\x00\x00\x00\x05world'
construct-classes
support nested structs, but you need to declare them explicitly:
class LargerStruct(Struct):
# specify the subclass type:
basic: BasicStruct = subcon(BasicStruct)
# in case of a list, specify the item type:
basic_array: List[BasicStruct] = subcon(BasicStruct)
# the `subcon()` function supports all arguments of `dataclass.field`:
default_array: List[BasicStruct] = subcon(BasicStruct, default_factory=list)
# to refer to the subcon, use the `SUBCON` class attribute:
SUBCON = c.Struct(
"basic" / BasicStruct.SUBCON,
"basic_array" / c.Array(2, BasicStruct.SUBCON),
"default_array" / c.PrefixedArray(c.Int8ul, BasicStruct.SUBCON),
)
Use dataclasses.field()
to specify attributes on fields that are not subcons.
There are currently no other features. In particular, the resulting class is a Python
dataclass, but you cannot specify its parameters like frozen
etc.
Installing
Install using pip:
$ pip install construct-classes
Changelog
See CHANGELOG.rst.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file construct-classes-0.1.2.tar.gz
.
File metadata
- Download URL: construct-classes-0.1.2.tar.gz
- Upload date:
- Size: 5.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.14 CPython/3.10.6 Linux/5.15.0-48-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 72ac1abbae5bddb4918688713f991f5a7fb6c9b593646a82f4bf3ac53de7eeb5 |
|
MD5 | b4f854e9940445a56eb66d4090d28626 |
|
BLAKE2b-256 | 83d3e42d3cc9eab95995d5349ec51f6d638028b9c21e7e8ac6bea056b36438b8 |
File details
Details for the file construct_classes-0.1.2-py3-none-any.whl
.
File metadata
- Download URL: construct_classes-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.14 CPython/3.10.6 Linux/5.15.0-48-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e82437261790758bda41e45fb3d5622b54cfbf044ceb14774af68346faf5e08e |
|
MD5 | 8ee39edb868246d07ba157e941555d6a |
|
BLAKE2b-256 | b26e3a939ab5d8f838c80190cb8f4447d2caf2bca714a8a20a9edf6eec373f66 |