A Python library offering a more concise syntax for data packing.
- From
pypi
pip install structovo
from structovo import *
class PackA(Packet):
a: PADDING
b: BYTE = b'A'
c: CHAR = -1
d: UCHAR = 1
e: BOOL = False
f: SHORT = -2
g: USHORT = 2
h: INT = -3
i: UINT = 3
j: LONG = -4
k: ULONG = 4
l: LONGLONG = -5
m: ULONGLONG = 5
n: SIZET = 12
o: SSIZET = 34
p: BINARY16 = 3.14
q: FLOAT = 3.14
r: DOUBLE = 3.14
s: FixedString = (b"hello", 10)
t: LengthPrefixedString = b"world"
u: UnsignedPointer = 0x0d000721
v: bytes = b'raw_bytes'
r = PackA.build(endianness=Endianness.NATIVE)
hex_list = [format(byte, '02x') for byte in r]
hex_str = ' '.join(hex_list)
print(hex_str)
And you will get:
00 41 ff 01 00 fe ff 02 00 fd ff ff ff 03 00 00 00 fc ff ff ff 04 00 00 00 fb ff ff ff ff ff ff ff 05 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 22 00 00 00 00 00 00 00 48 42 c3 f5 48 40 1f 85 eb 51 b8 1e 09 40 68 65 6c 6c 6f 00 00 00 00 00 05 77 6f 72 6c 64 21 07 00 0d 00 00 00 00 72 61 77 5f 62 79 74 65 73
Endianness.BIG
: Big-endianEndianness.LITTLE
: Little-endianEndianness.NETWORK
: Big-endianEndianness.NATIVE
: Depend on your device (Default)
You can define your own data types by simply inheriting the BaseType
class:
from typing import Tuple, Type
from structovo import BaseType, Endianness
class MyDataType(BaseType):
def check_validation(self) -> Tuple[bool, Type]:
# Implement the validation of whether the self.value is valid.
return ...
def encode(self, endianness: Endianness) -> bytes:
# Implement the operation of converting self.value to bytes.
return ...
Like this:
from typing import Tuple, Type
from structovo import BaseType, Endianness
class BYTE(BaseType):
def check_validation(self) -> Tuple[bool, Type]:
result = isinstance(self.value, bytes)
return result, bytes
def encode(self, endianness: Endianness) -> bytes:
return self._pack('c', endianness)