Skip to main content

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 Distribution

c_struct_data_parser-0.4.0.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

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

c_struct_data_parser-0.4.0-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

File details

Details for the file c_struct_data_parser-0.4.0.tar.gz.

File metadata

File hashes

Hashes for c_struct_data_parser-0.4.0.tar.gz
Algorithm Hash digest
SHA256 eb8216b73b7ffb931a8c14a0244ae943df439ff9ec4bc52996481d98a5259d13
MD5 67d4392dae7688eb85eb41e9bc33eaf5
BLAKE2b-256 630a8a2a145a575fa587cdcf938d88c441c692707e2026c07ab41fcd5856a5e5

See more details on using hashes here.

File details

Details for the file c_struct_data_parser-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for c_struct_data_parser-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 06056ca2cc96dc8310fe0e9257fa82d4365907e730aa377de30be36c169fecdc
MD5 0340f85e74701dc7474176b9c840bf04
BLAKE2b-256 2cf97fe5bc4b59c59466f4cf5c53867d17f35595da1ed1b8e4c41da980694d0b

See more details on using hashes here.

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