Skip to main content

A powerful declarative symmetric parser/builder for binary data

Project description

Malstruct

Malstruct is a powerful declarative and symmetrical parser and builder for binary data that was forked from construct as of release 2.10.70.

Instead of writing imperative code to parse a piece of data, you declaratively define a data structure that describes your data. As this data structure is not code, you can use it in one direction to parse data into Pythonic objects, and in the other direction, to build objects into binary data.

The library provides both simple, atomic constructs (such as integers of various sizes), as well as composite ones which allow you form hierarchical and sequential structures of increasing complexity. Construct features bit and byte granularity, easy debugging and testing, an easy-to-extend subclass system, and lots of primitive constructs to make your work easier:

  • Fields: raw bytes or numerical types

  • Structs and Sequences: combine simpler constructs into more complex ones

  • Bitwise: splitting bytes into bit-grained fields

  • Adapters: change how data is represented

  • Arrays/Ranges: duplicate constructs

  • Meta-constructs: use the context (history) to compute the size of data

  • If/Switch: branch the computational path based on the context

  • On-demand (lazy) parsing: read and parse only what you require

  • Pointers: jump from here to there in the data stream

  • Tunneling: prefix data with a byte count or compress it

Example

A Struct is a collection of ordered, named fields:

>>> format = Struct(
...     "signature" / Const(b"BMP"),
...     "width" / Int8ub,
...     "height" / Int8ub,
...     "pixels" / Array(this.width * this.height, Byte),
... )
>>> format.build(dict(width=3,height=2,pixels=[7,8,9,11,12,13]))
b'BMP\x03\x02\x07\x08\t\x0b\x0c\r'
>>> format.parse(b'BMP\x03\x02\x07\x08\t\x0b\x0c\r')
Container(signature=b'BMP')(width=3)(height=2)(pixels=[7, 8, 9, 11, 12, 13])

A Sequence is a collection of ordered fields, and differs from Array and GreedyRange in that those two are homogenous:

>>> format = Sequence(PascalString(Byte, "utf8"), GreedyRange(Byte))
>>> format.build([u"lalaland", [255,1,2]])
b'\nlalaland\xff\x01\x02'
>>> format.parse(b"\x004361789432197")
['', [52, 51, 54, 49, 55, 56, 57, 52, 51, 50, 49, 57, 55]]

Included in malstruct is the pecon (PE file reconstruction utility) package. Please see the pecon API documentation for more information.

Changelog

The format is based on Keep a Changelog, and this project adheres to Calendar Versioning with the schema MAJOR.MINOR.YYYY0M0D.

3.0.20260429 - 2026-04-29

Changed

  • Split out core functionality across adapters, alignment, analysis, bytes_, conditional, exceptions, expr, helpers, integers, lazy, mappings, miscellaneous, stream, strings, and transforms

  • Moved binary file analysis to malstruct.binaryfiles

  • Moved remaining malstruct.utils functionality to base level

  • Added pecon utility as an installed package

  • Move from “flat” layout to “src” layout

  • Use pyproject.toml configuration file for packaging

Removed

  • Removed usage of __all__ in init

  • Removed usage of compilation feature and benchmarks

  • Removed py3compat functionality

  • Removed pefileutils and elffileutils

  • Removed functionality from machoutils unrelated to malstructs/adapters

2.10.71

Changed

  • Reverted default behavior changed by https://github.com/construct/construct/pull/1015
    • OffsettedEnd, Prefixed, FixedSize, NullTerminated, NullStriped, ProcessXor use offsets relative to the last occurrence of these subconstructs

    • To use offsets relative to the beginning of the stream set absolute=True when constructing these constructs

  • Moved optional dependencies to required dependencies

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

malstruct-3.0.20260429.tar.gz (123.8 kB view details)

Uploaded Source

Built Distribution

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

malstruct-3.0.20260429-py3-none-any.whl (112.0 kB view details)

Uploaded Python 3

File details

Details for the file malstruct-3.0.20260429.tar.gz.

File metadata

  • Download URL: malstruct-3.0.20260429.tar.gz
  • Upload date:
  • Size: 123.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for malstruct-3.0.20260429.tar.gz
Algorithm Hash digest
SHA256 3b1653e004df79490754c37932fb550961f140d2e429d77311174c5a408f5556
MD5 78eaae3dc1df12a2dba6fca86ac60271
BLAKE2b-256 5c7f936cdee8a9d94c3695b26376a373df1a9884ac52d6447a36f8f4c5a9c74c

See more details on using hashes here.

Provenance

The following attestation bundles were made for malstruct-3.0.20260429.tar.gz:

Publisher: main.yml on ciphertechsolutions/malstruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file malstruct-3.0.20260429-py3-none-any.whl.

File metadata

File hashes

Hashes for malstruct-3.0.20260429-py3-none-any.whl
Algorithm Hash digest
SHA256 a14d4fb2311fb876d61edbc802d5d0bd65b66f8deb16cea2bd24259bd25367d9
MD5 2b914e9b8fbaa3d4feb60b2749c4a13e
BLAKE2b-256 007e3c9f73c2908dd79ddc1ad3e989c851b409fa78debf4f2cd9e9663c17a095

See more details on using hashes here.

Provenance

The following attestation bundles were made for malstruct-3.0.20260429-py3-none-any.whl:

Publisher: main.yml on ciphertechsolutions/malstruct

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