Read/Write binary files after describing their specifications in code (similar to an ORM table schema)
Project description
BinaryFileParser
BinaryFileParser allows the user to create a binary file format specification in the form of a struct and then use it to read/write files.
Installation
On Linux:
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install binary-file-parser
On Windows:
> py -m venv venv
> venv/Scripts/activate
> pip install binary-file-parser
Getting Started
This is a very basic script to give you an idea of how to use this library. Check out the API Reference (coming soon™) for documentation containing more details on how to use this library.
from binary_file_parser import BaseStruct, Retriever
from binary_file_parser.types import int32, uint64, str32, FixedLenStr
class Spam(BaseStruct):
file_version: str = Retriever(FixedLenStr[4], default = "1.00")
creator_name: str = Retriever(str32, default = "bfp")
saved_timestamp: int = Retriever(uint64, default = 0)
eggs: int = Retriever(int32, default = 0)
# read a binary file that has the above format
file = Spam._from_file("path/to/file")
# modify the creator name
file.creator_name = "Alian713"
file.eggs = 20
# write the modified data to a new file
file._to_file("path/to/write/to")
A Slightly More Complex Example
The main magic of this library is that:
- You can use your own structs within another struct
- Event hooks help you keep any interdependencies in the file structure synchronised:
from __future__ import annotations
from binary_file_parser import BaseStruct, Retriever
from binary_file_parser.types import FixedLenArray, uint32, uint8
class Pixel(BaseStruct):
red: int = Retriever(uint8, default = 0)
green: int = Retriever(uint8, default = 0)
blue: int = Retriever(uint8, default = 0)
alpha: int = Retriever(uint8, default = 0)
def __init__(
self,
red: int,
green: int,
blue: int,
alpha: int = 0,
):
super().__init__(initialise_defaults = False)
self.red = red
self.green = green
self.blue = blue
self.alpha = alpha
class Img(BaseStruct):
@staticmethod
def _set_width(retriever: Retriever, obj: Img):
# here Img.pixels.dtype refers to FixedLenArray
Img.pixels.dtype.length = obj._width
@staticmethod
def _set_height(retriever: Retriever, obj: Img):
# The repeat value defines how many times a single retriever should read data
Retriever.set_repeat(Img.pixels, obj, obj._height)
@staticmethod
def _update_dims(retriever: Retriever, obj: Img):
# this ensures that when the file is written back, the height and width being written back to file are
# up to date
obj._height = obj.height
Img.pixels.dtype.length = obj._width = obj.width
_width: int = Retriever(uint32, default = 100, on_read = [_set_width], on_write = [_update_dims])
_height: int = Retriever(uint32, default = 200, on_set = [_set_height])
pixels: list[list[Pixel]] = Retriever(
FixedLenArray[Pixel, 100], default_factory = lambda _: [Pixel(0, 0, 0) for _ in range(100)], repeat = 200
)
@property
def width(self) -> int:
return len(self.pixels[0])
@property
def height(self) -> int:
return len(self.pixels)
# Make a new image from all defaults
a = Img()
# Note: Mutable defaults will be shallow copied, use default_factory when such is not intended
About the Author
If you have any questions, suggestions or feedback regarding the library, feel free to send me a message on discord!
Author | Discord |
---|---|
Alian713 | Alian713#0069 |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file binary_file_parser-0.2.2.tar.gz
.
File metadata
- Download URL: binary_file_parser-0.2.2.tar.gz
- Upload date:
- Size: 55.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 260de5d3e33381763c31d95ccaf2d0ceceec12915de694d1c9dbab66d9b9dd45 |
|
MD5 | 0bdd08df06cd95b76622078326777bba |
|
BLAKE2b-256 | 1df066ac7e56081bac8cbfbcdc8eaae73d76a5316321f268400251e5cd10e650 |
File details
Details for the file binary_file_parser-0.2.2-py3-none-any.whl
.
File metadata
- Download URL: binary_file_parser-0.2.2-py3-none-any.whl
- Upload date:
- Size: 51.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fb0512c72ce48e193757b9b746e96db482d59028ce9c9d89d5710cc00fc30cff |
|
MD5 | 33d60398e498ab80345376f785fc0136 |
|
BLAKE2b-256 | dd72a7779e72cf2914868736a822007fb655cb2fbc542470ed0fabf5e80b54a6 |