Skip to main content

Library to pack and unpack structurized binary data.

Project description

Caterpillar - 🐛

python Latest Version Build and Deploy Docs Run Tests GitHub issues GitHub License

Caterpillar is a Python 3.12+ library to pack and unpack structurized binary data (with support for 3.10+). It enhances the capabilities of Python Struct by enabling direct class declaration. More information about the different configuration options will be added in the future. Documentation is here >.

Caterpillar is able to:

  • Pack and unpack data just from processing Python class definitions (including support for powerful bitfields, c++-like templates and c-like unions!),
  • apply a wide range of data types (with endianess and architecture configuration),
  • dynamically adapt structs based on their inheritance layout,
  • reduce the used memory space using __slots__,
  • allowing you to place conditional statements into class definitions,
  • insert proper types into the class definition to support documentation and
  • it helps you to create cleaner and more compact code.
  • There is also a feature that lets you dynamically change the endian within a struct!
  • You can even extend Caterpillar and write your parsing logic in C or C++!!

[!NOTE] Python 3.14 breaks with statements in class definitions since __annotations__ are added at the end of a class definition. Therefore, Digest and conditional statements ARE NOT SUPPORTED using the with syntax in Python 3.14+. As of version 2.4.5 the Digest class has a counterpart (DigestField), which can be used to manually specify a digest without the need of a ẁith statement.

Give me some code!

from caterpillar.py import *

@bitfield(order=LittleEndian)
class Header:
    version : 4                # 4bit integer
    valid   : 1                # 1bit flag (boolean)
    ident   : (8, CharFactory) # 8bit char
    # automatic alignment to 16bits

@struct(order=LittleEndian)
class Format:
    magic  : b"ITS MAGIC"        # Supports string and byte constants directly
    header : Header
    a      : uint8               # Primitive data types
    b      : Dynamic + int32     # dynamic endian based on global config
    length : uint8               # String fields with computed lengths
    name   : String(this.length) #  -> you can also use Prefixed(uint8)

    _hash_begin : DigestField.begin("hash", Md5_Algo)   # custom actions, e.g. for hashes
    names       : CString[uint8::]                      # Sequences with prefixed, computed lengths
    hash        : Md5_Field("hash", verify=True) = None # automatic hash creation and verification + default value

# Instantiation (keyword-only arguments, magic is auto-inferred):
obj = Format(
    header=Header(version=2, valid=True, ident="F"),
    a=1,
    b=2,
    length=3,
    name="foo",
    names=["a", "b"]
)
# Packing the object, reads as 'PACK obj FROM Format'
# objects of struct classes can be packed right away
blob = pack(obj, Format)
# results in: b'ITS MAGIC0*\x01\x02\x00\x00\x00\x03foo\x02a\x00b\x00)\x9a...'

# Unpacking the binary data, reads as 'UNPACK Format FROM blob'
obj2 = unpack(Format, blob)

# to pack with a different endian for field 'b', use _order
data = pack(obj, Format, _order=BigEndian)

This library offers extensive functionality beyond basic struct handling. For further details on its powerful features, explore the official documentation, examples, and test cases.

Installation

[!NOTE] As of Caterpillar v2.1.2 it is possible to install the library without the need of compiling the C extension.

PIP installation (Python-only)

pip install caterpillar-py

Python-only installation

pip install "caterpillar[all]@git+https://github.com/MatrixEditor/caterpillar"

Installation + C-extension

pip install "caterpillar[all]@git+https://github.com/MatrixEditor/caterpillar/#subdirectory=src/ccaterpillar"

Starting Point

Please visit the Documentation, it contains a complete tutorial on how to use this library.

Other Approaches

A list of similar approaches to parsing structured binary data with Python can be taken from below:

The documentation also provides a Comparison to these approaches.

License

Distributed under the GNU General Public License (V3). See License for more information.

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

caterpillar_py-2.7.0.tar.gz (100.2 kB view details)

Uploaded Source

Built Distribution

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

caterpillar_py-2.7.0-py3-none-any.whl (145.9 kB view details)

Uploaded Python 3

File details

Details for the file caterpillar_py-2.7.0.tar.gz.

File metadata

  • Download URL: caterpillar_py-2.7.0.tar.gz
  • Upload date:
  • Size: 100.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for caterpillar_py-2.7.0.tar.gz
Algorithm Hash digest
SHA256 4be569da514fec2f778ea7ff1ade5e5627e2d235ff626dcf8fe2bdba523d430c
MD5 299154beabb2d7d3f55a54d4d1c21252
BLAKE2b-256 79ac5a00b74cd8963ed5e36f7a84d1b9af2c73003676a338f3601377ce6df861

See more details on using hashes here.

Provenance

The following attestation bundles were made for caterpillar_py-2.7.0.tar.gz:

Publisher: python-publish.yml on MatrixEditor/caterpillar

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

File details

Details for the file caterpillar_py-2.7.0-py3-none-any.whl.

File metadata

  • Download URL: caterpillar_py-2.7.0-py3-none-any.whl
  • Upload date:
  • Size: 145.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for caterpillar_py-2.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3f061e5c211f779aa7bab0648d11a4ea1a988e26bb56937150e9a89499d4d507
MD5 ad256f20e81489b3cadbca8e931fbeb5
BLAKE2b-256 73f7489738efb1e558fdb5ffe0a1ae8921d71b64e2ef019fae830bb42e3a84a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for caterpillar_py-2.7.0-py3-none-any.whl:

Publisher: python-publish.yml on MatrixEditor/caterpillar

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