Because construct was too complicated.
This is a simple and easy to use library that provides two classes. One class serializes data, and the other one deserializes. These classes behave like streams in which they have read, write, close among other stream related functions. The goal of this library is to be as simple as possible while providing flexibility.
To install the library, use the following:
python -m pip install --user -U pydatastreamsTo import the library, use the following:
from datastream import SerializingStream, DeserializingStream, TwoWayStream, ByteOrderRetrieving serialized data from a SerializingStream:
with SerializingStream() as stream:
stream.write_int32(42)
serialized = stream.bytes()
# this also works
serialized = bytes(stream)Note: This library also contains a stream for both serializing and deserializing data. This stream is called TwoWayStream.
The stream classes support serializing/deserializing the standard data types:
| Data Type | Description | Serializer | Deserializer |
|---|---|---|---|
int8_t |
Signed 8-bit number | write_int8(value: int) |
read_int8() -> int |
uint8_t |
Unsigned 8-bit number | write_uint8(value: int) |
read_uint8() -> int |
int16_t |
Signed 16-bit number | write_int16(value: int) |
read_int16() -> int |
uint16_t |
Unsigned 16-bit number | write_uint16(value: int) |
read_uint16() -> int |
int32_t |
Signed 32-bit number | write_int32(value: int) |
read_int32() -> int |
uint32_t |
Unsigned 32-bit number | write_uint32(value: int) |
read_uint32() -> int |
int64_t |
Signed 64-bit number | write_int64(value: int) |
read_int64() -> int |
uint64_t |
Unsigned 64-bit number | write_uint64(value: int) |
read_uint64() -> int |
float |
32-bit floating point number | write_float(value: float) |
read_float() -> float |
double |
64-bit floating point number | write_double(value: float) |
read_double() -> float |
Additionally, the stream classes also provide the following non-standard data types:
| Data Type | Description | Serializer | Deserializer |
|---|---|---|---|
bool |
True/False value encoded as a single byte | write_bool(value: bool) |
read_bool() -> bool |
uleb128 |
Variable sized unsigned 128-bit number | write_uleb128(value: int) |
read_uleb128() -> int |
write_uleb128_safe(value: int, max_bytes: int = 16) |
read_uleb128_safe(max_bytes: int = 16) -> int |
||
sleb128 |
Variable sized signed 128-bit number | write_sleb128(value: int) |
read_sleb128() -> int |
write_sleb128_safe(value: int, max_bytes: int = 16) |
read_sleb128_safe(max_bytes: int = 16) -> int |
Finally, the stream classes also provide the following utility functions:
| Function | Description |
|---|---|
set(buffer: bytes | typing.IO[bytes]) |
Sets the backing stream to the given buffer. DeserializingStream only. |
read_until(terminator: bytes) -> bytes |
Reads len(terminator) bytes from the stream until terminator is found. DeserializingStream only. |
read(size: int) -> bytes |
Reads up to size bytes from the backing stream. |
write(data: bytes) |
Writes the given data to the backing stream. |
size() -> int |
Returns the size of the backing stream. |
seek(offset: int, whence: int = io.SEEK_SET) |
Change the stream position to the given offset. |
tell() -> int |
Returns the current position of the stream. |
close() |
Closes the backing stream. |
remaining() -> int |
Returns the number of bytes remaining in the backing stream. |
clone() -> typing.Self |
Returns a new instance of the same class with the same byte order and contents. |
substream(start: int, end: int) -> typing.Self |
Returns a new instance of the same class, representing a substream of the current stream. |
peek(size: int) -> bytes |
Returns the next size bytes from the stream without advancing the position. |
seekpeek(offset: int, size: int) -> bytes |
Seeks to the specified offset in the data stream, reads the specified number of bytes, and then restores the original position. |
search(data: bytes) -> int |
Searches for the given data in the backing stream. |
rsearch(data: bytes) -> int |
Searches for the given data in the reverse order within the backing stream. |
clear() |
Clears the backing stream by truncating it to 0 bytes and resetting the stream position to the beginning. |