Declaratively define and parse C data structures
Project description
c_struct_data_parser
Intended to facilitate declarative, dynamic definition of C data structures.
The library will autogenerate a parser which you can connect to a BytesReader or some IO based variant.
You're better off looking at https://github.com/fox-it/dissect.cstruct
Examples from test_basic.py:
Struct2Int = create_struct_definition(
"Struct2Int",
{
"value_a": Int4Definition,
"value_b": Int4Definition,
},
)
def test_struct2Int() -> None:
value_a = 0x12345678
value_b = 0x99887766
bs = b"".join(map(int_to_le_bytes_4, [value_a, value_b]))
bytes_reader = BytesReader(address=0, bs=bs)
struct_2_int, new_reader = Struct2Int.parser(bytes_reader)
assert struct_2_int.value_a.value == value_a
assert struct_2_int.value_b.value == value_b
print(struct_2_int)
BitFieldsExample = create_bit_fields_definition(
"BitFieldsExample",
Int4Definition,
{
"field_a": 4,
"reserved_1": 5,
"field_b": 5,
},
)
def test_bit_fields() -> None:
val = 0x123456
bs = int_to_le_bytes_4(val)
bytes_reader = BytesReader(address=0, bs=bs)
bit_fields_example, new_reader = BitFieldsExample.parser(bytes_reader)
assert bit_fields_example.field_a.value == val & 0xF
assert bit_fields_example.field_b.value == (val >> 9) & 0x1F
print(bit_fields_example)
Struct2IntPointer = create_pointer_definition(
Struct2Int,
Int4Definition,
)
def test_pointer_type() -> None:
value_a = 0x12345678
value_b = 0x99887766
bs_struct = b"".join(map(int_to_le_bytes_4, [value_a, value_b]))
bs_pointer = int_to_le_bytes_4(0x2000)
bs = b"".join([bs_struct, bs_pointer])
bytes_reader = BytesReader(address=0x2000, bs=bs)
struct_2_int, new_reader = Struct2Int.parser(bytes_reader)
assert struct_2_int.value_a.value == value_a
assert struct_2_int.value_b.value == value_b
p_struct_2_int, new_reader_2 = Struct2IntPointer.parser(new_reader)
print(p_struct_2_int)
struct_2_int_copy = p_struct_2_int.resolve(new_reader_2)
assert struct_2_int_copy.value_a.value == value_a
assert struct_2_int_copy.value_b.value == value_b
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file c_struct_data_parser-0.5.2-py3-none-any.whl.
File metadata
- Download URL: c_struct_data_parser-0.5.2-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4db0a8e28ed4fb81c5e1d8dbab650f14a60a254144ef74037a241619a6b8a9e
|
|
| MD5 |
a807e2e7cad41d127c5a43d5daf5dac8
|
|
| BLAKE2b-256 |
729638955aaa6db6e39afb52f585cb3fa025bc95abc0f3361431e48a3a27a98d
|