use class to parse binary format
Project description
StructReader – Binary Structure Parsing Framework
Installation
Install StructReader from PyPI:
pip install StructReader
Update
Update an existing installation of StructReader:
pip install --upgrade StructReader
1. Overview
StructReader is a binary format parsing framework for Python.
It is designed specifically for structured binary data parsing, where the layout is known or partially known, such as custom file formats.
Instead of manually reading bytes and tracking offsets, you declare the binary format structure, and StructReader handles stream reading, endianness, field dependencies, and control flow.
2. Basic Idea
You define a binary structure as a Python class.
- Each class attribute represents one field
- The attribute value describes how to read the field
The framework:
- Compiles the structure into an internal opcode representation
- Executes the opcodes against a binary stream
- Produces a Python object or dictionary
3. Defining a Structure
Example
class Header:
magic = UIntBE[32]
size = UInt[16]
data = Bytes[Var.size]
Parsing:
obj = ParseStruct(Header, data)
Access fields:
print(obj.magic)
print(obj.size)
print(obj.data)
4. Primitive Types
4.1 Integer Types
| Type | Description |
|---|---|
Int[n] |
Signed integer, n bits |
UInt[n] |
Unsigned integer, n bits |
IntLE[n] |
Little-endian signed |
IntBE[n] |
Big-endian signed |
UIntLE[n] |
Little-endian unsigned |
UIntBE[n] |
Big-endian unsigned |
Example:
id = UInt[32]
flags = UIntBE[16]
4.2 Floating Point Types
| Type | Description |
|---|---|
Float[n] |
Floating point, default endianness |
FloatLE[n] |
Little-endian |
FloatBE[n] |
Big-endian |
Example:
x = Float[32]
y = FloatBE[64]
4.3 Strings
Str[length]
Str[length, encoding]
StrU[length]
StrU[length, encoding]
lengthmay be a constant or a previously defined field- Default encoding is UTF-8
Example:
name_len = UInt[8]
name = Str[Var.name_len]
name2_len = UInt[8]
name2 = StrU[Var.name_len2]
4.4 Raw Bytes
Bytes[length]
Reads raw bytes from the stream.
Example:
payload = Bytes[16]
4.5 Variable-Length Integer
Uvarint
Svarint
Reads an unsigned/signed variable-length integer using 7-bit continuation encoding.
4.6 Boolean
Bool
Reads 1 byte and returns True if non-zero.
4.7 Stream Length
Len
Returns the total length of the input stream (in bytes).
Example:
class File:
size = Len
4.8 Until (Terminated Read)
Until[value]
Reads data until a terminator value is encountered.
- The terminator is not included in the result
- Stream position advances past the terminator
Example:
name = Str[Until[b'\x00']]
data = Bytes[Until[b'\xFF\xFF']]
4.9 Align (Alignment Helper)
Align[n]
Returns the number of bytes needed to align the stream position to n.
Usually combined with Seek.
Example:
pad = Align[16]
Seek[Var.pad, 1]
5. Composite Types
5.1 List (Array)
List[count, value_type]
countmay be a constant or another field
Example:
count = UInt[16]
items = List[Var.count, UInt[32]]
5.2 Nested Structures
Structures can be nested by referencing another structure class.
Example:
class Point:
x = Int[32]
y = Int[32]
class Shape:
center = Point
radius = UInt[16]
6. Field References (Var)
Var.field_name
Allows a field to reference a previously parsed field.
Example:
class Packet:
length = UInt[16]
data = Bytes[Var.length]
7. Stream Position Control
7.1 Current Position
Pos
Returns the current read position in the stream.
7.2 Seek
Seek[offset, mode]
If mode is omitted, it defaults to 0.
| Mode | Meaning |
|---|---|
0 |
Absolute position |
1 |
Relative to current position |
2 |
Relative to end |
Example:
Seek[128] # same as Seek[128, 0]
Seek[128, 0] # absolute position
Seek[16, 1] # relative to current position
7.3 Peek (Non-consuming Read)
Peek[value]
Reads a value without advancing the stream position.
Example:
next_type = Peek[UInt[8]]
8. Conditional Parsing (Match)
Match[cond, params, results]
Selects one parsing branch based on the value of cond.
Example:
class Entry:
type = UInt[8]
data = Match[
lambda t: 1 if t > 1 else 2 if t > 2 else 0,
[Var.type],
[
UInt[32], # index 0
Str[8], # index 1
Bytes[8], # index 2
]
]
9. Conditional Parsing (While)
While[cond, params, body]
Repeatedly parses body while the condition cond evaluates to True.
Example:
class Entry:
values = While[
lambda c: c < 128, # cond
[UInt[8]], # params
[UInt[16]] # body
]
10. Select value (Select)
Select[number, values]
Select from values based on the passed value.
Example:
class Entry:
values = Select[
UInt[8],
[0, Uint[32], Uint[8]]
]
11. Custom Functions (Func)
Func[callable, params...]
Calls a Python function with parsed parameters.
Example:
def checksum(a, b):
return a ^ b
class Block:
a = UInt[8]
b = UInt[8]
c = Func[checksum, Var.a, Var.b]
12. Group
Group[param1, param2, ...]
Used to group multiple parameters, mainly for function calls.
13. Parsing API
ParseStruct
ParseStruct(struct, data,
ReturnDict=False,
order='little',
encoding='utf-8',
order2=None,
bytesToHex=False)
Parameters
-
struct- A structure class or a compiled structure dictionary
-
databytes,bytearray,memoryview, orBufferedReader
-
ReturnDict(bool)False(default): return an object with attributesTrue: return a dictionary
-
order('little'|'big')- Default integer byte order
-
encoding(str)- Default string encoding
-
order2('<'|'>'| None)- Float byte order override
- If
None, inferred fromorder
-
bytesToHex(bool)- If
True,Bytes[...]fields return hexadecimal strings
- If
Parse to Dictionary
obj = ParseStruct(MyStruct, data, ReturnDict=True)
Returns a dictionary instead of an object.
Input Data Types
The input stream may be:
bytesbytearraymemoryviewBufferedReader
14. Error Handling
- Parsing errors raise
RuntimeError - The error contains the failing field definition
- Context (
Var) is reset between parse calls
15. Design Advantages
- Explicit support for binary format parsing
- Declarative structure definitions
- Configurable endianness and encoding
- Field dependency via
Var - Conditional parsing (
Match) - Stream control (
Seek,Peek,Pos) - Object or dictionary output modes
- No external dependencies
16. Default Value
| Type | Default |
|---|---|
Int |
Int[32] |
UInt |
UInt[32] |
IntLE |
IntLE[32] |
IntBE |
IntBE[32] |
UIntLE |
UIntLE[32] |
UIntBE |
UIntBE[32] |
Float |
Float[32] |
FloatLE |
FloatLE[32] |
FloatBE |
FloatBE[32] |
Str |
Str[UInt[8]] |
Bytes |
Bytes[UInt[8]] |
Seek |
Seek[0] |
Until |
Until[b'\x00'] |
Align |
Align[16] |
17. Minimal Complete Example
from StructReader import ParseStruct
class Example:
a = UInt[16]
b = UInt[16]
obj = ParseStruct(Example, b"\x00\x01\x00\x02")
print(obj.a, obj.b)
from StructReader import CompileStruct, ParseStruct
class Example:
a = UInt[16]
b = UInt[16]
myStruct = CompileStruct(Example)
obj = ParseStruct(myStruct, b"\x00\x01\x00\x02")
print(obj.a, obj.b)
18. Summary
StructReader focuses on binary format parsing through a declarative, structure‑first approach.
By separating format description from byte reading logic, it allows complex binary layouts to be expressed clearly, maintained easily, and extended safely.
StructReader is especially suitable for projects involving:
- Complex or nested binary formats
- Field‑dependent layouts
- Conditional and dynamic parsing
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file structreader-1.0.33.tar.gz.
File metadata
- Download URL: structreader-1.0.33.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44df16a6bfaf9271d00aa61dda182ae303b7996c2ea19c6a9b7e07bf435b6628
|
|
| MD5 |
fcaa618b27746f8b408689d119fa7fe3
|
|
| BLAKE2b-256 |
cabf6a1d41c38c664b578f7bf2a02eed6a11eb2dec2d4f48b9ec530aa367c092
|
File details
Details for the file structreader-1.0.33-py3-none-any.whl.
File metadata
- Download URL: structreader-1.0.33-py3-none-any.whl
- Upload date:
- Size: 10.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
adacddf804d036fcb8dc6b2b5afb25f4b2e9bc669badc1c9ff2a4e5bd66f0dc8
|
|
| MD5 |
181dd852f56b3a57f4e8842baeaf1d23
|
|
| BLAKE2b-256 |
f45147de4fb8ed9ed398da9a03aad40a8186c0ba6ccb71e3495719c6b4b14fc6
|