Skip to main content

Build status Python versions Installs per month Total installs

A cross-platform Python 3 library for reading and writing structured binary data in an object-oriented (ish) style.

Why use binobj?

You may have used Python’s built-in struct library to load and dump binary data. It’s unwieldy for larger or more complex data structures, and the format strings are easy to get wrong. binobj is different in that it takes a class-based approach to declaring binary structures.

Take a look at this example using struct:

data = (b'BM', 1024, 0, 12, 40, 32, 32, 1, 1, 0, 0, 72, 72, 2, 2)
header_bytes = struct.pack('<2sIIIIiiHHIIiiII', *data)
loaded = struct.unpack('<2sIIIIiiHHIIiiII', header_bytes)
n_pixels = loaded[5] * loaded[6]

The same example rewritten using binobj:

class BMP(binobj.Struct):
    class Meta:
        argument_defaults = {
            "endian": "little"
        }

    magic: Bytes = b"BM"
    file_size: UInt32
    _reserved: binobj.Bytes(const=b"\0\0\0\0", discard=True)
    pixels_offset: UInt32

    # Legacy DIB header
    header_size: UInt32 = 40
    image_width: Int32
    image_height: Int32
    n_color_planes: UInt16
    n_bits_per_pixel: UInt16
    compression_method: UInt32 = 0
    bitmap_size: UInt32
    v_resolution: Int32
    h_resolution: Int32
    n_palette_colors: UInt32
    n_important_colors: UInt32

bmp = BMP(file_size=1024, pixels_offset=12, image_width=32, image_height=32, ...)
header_bytes = bytes(bmp)
loaded = BMP.from_bytes(header_bytes)
n_pixels = loaded.image_width * loaded.image_height

binobj also has other advantages in that it supports strings in any encoding Python supports, toggling endianness on a per-field basis (necessary for ISO 9660 images), a variety of integer encodings, computed fields, validation, and more.

System Requirements

  • This package will not work on a mixed-endian system. Those are pretty rare nowadays so chances are you won’t have a problem.

  • This has been tested on CPython 3.9-3.13, PyPy 3.9-3.10.

Installation

You can install this with pip like so:

pip3 install binobj
  • Be sure to use pip3 and not pip, because pip defaults to Python 2.

  • If you get a “Permission Denied” error, try:

pip3 install --user binobj

Side note: Don’t use sudo (even sudo -EH) to force a package to install, as that’s a security risk. See this answer on Stack Overflow to find out why.

Testing and Development

This package uses Tox to run tests on multiple versions of Python.

Setup

To set up your development environment, you’ll need to install a few things.

  • For Python version management, I use pyenv-virtualenv. Follow the installation instructions there.

  • You’ll also need make. Depending on your platform you can install it in one of several ways:

    • macOS: brew install make

    • Debian systems (e.g. Ubuntu): sudo apt-get install make

    • Windows: Use Cygwin and install it during setup.

Once you have those installed, in the root directory of this repo run:

make setup

Running the Tests

To run the unit tests for all supported versions of Python, run make test. The environments will automatically be rebuilt if needed.

Issues and Feature Requests

To report an issue, request a feature, or propose a change, please file a report on the project’s GitHub page here.

License

I’m releasing this under the terms of the 3-Clause BSD License. For the full legal text, see LICENSE.txt in the repository.

Metadata

Release files for binobj 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for binobj 0.12.0
File Size Uploaded
binobj-0.12.0.tar.gz 46.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for binobj 0.12.0
File Interpreter ABI Platform
binobj-0.12.0-py3-none-any.whl Python 3 none any Details

Total release size: 100.5 kB

Release files / binobj-0.12.0.tar.gz

Download URL binobj-0.12.0.tar.gz
Size 46.9 kB
Tags Source
SHA-256 checksum
How to use checksums
597bc3c781eebd3c21683e1eed8da6ee0e8ce0dbbc8ad3b454d969295a3329c2
BLAKE2b-256 checksum
How to use checksums
d0e38a69857c4a36ece8dde80d59c3058014fae9521c6ed33dc2ac6602375105
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.12.3 Linux/6.6.47-gentoo-dist

Release files / binobj-0.12.0-py3-none-any.whl

Download URL binobj-0.12.0-py3-none-any.whl
Size 53.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
724fcc60969c269f23b03ac4a3269128d82e4c9794a902319f280b1872c00c4c
BLAKE2b-256 checksum
How to use checksums
def1556689c2e28ccedf97e6d6afcad6e27155b73b69d14b8b38ca8813405293
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.12.3 Linux/6.6.47-gentoo-dist

Release history Release notifications | RSS feed

This release

0.12.0 This release

2 release files

0.11.4

2 release files

0.11.3

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.10.5

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.6

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page