Module binput

Classes

class BinaryEndian (*args, **kwds)
Expand source code
class BinaryEndian(Enum):
    LITTLE = "<"
    BIG = ">"

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

Color.RED

  • value lookup:

Color(1)

  • name lookup:

Color['RED']

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Ancestors

  • enum.Enum

Class variables

var BIG
var LITTLE
class BinaryReader (file_path: pathlib.Path,
endian: BinaryEndian = BinaryEndian.LITTLE)
Expand source code
class BinaryReader(AbstractContextManager):
    def __init__(self, file_path: Path, endian: BinaryEndian = BinaryEndian.LITTLE):
        self.file_path = file_path
        self.endian = endian
        self.fp = None

    def __enter__(self) -> Self:
        return self.open()

    def __exit__(self, *e):
        return self.close()

    def open(self) -> Self:
        self.fp = open(self.file_path, "rb")
        return self

    def close(self):
        return self.fp.close()

    def read(self, number: int) -> bytes:
        return self.fp.read(number)

    def unpack(self, type: str, size: int) -> int:
        return up(f"{self.endian.value}{type}", self.read(size))[0]

    def read_u8(self) -> int:
        return self.unpack("B", 1)

    def read_i8(self) -> int:
        return self.unpack("b", 1)

    def read_u16(self) -> int:
        return self.unpack("H", 2)

    def read_i16(self) -> int:
        return self.unpack("h", 2)

    def read_u32(self) -> int:
        return self.unpack("I", 4)

    def read_i32(self) -> int:
        return self.unpack("i", 4)

    def read_u64(self) -> int:
        return self.unpack("Q", 8)

    def read_i64(self) -> int:
        return self.unpack("q", 8)

    def seek(self, offset: int) -> int:
        return self.fp.seek(offset)

    def tell(self) -> int:
        return self.fp.tell()

    def skip(self, number: int) -> int:
        return self.seek(self.tell() + number)

    def read_utf8_str(self, length: int) -> str:
        return self.read(length).decode("utf-8")

    def read_utf8_nt_str(self, nt: int = 0) -> str:
        byte_array = bytearray()
        while (byte := self.read_ubyte()) != nt:
            byte_array.append(byte)
        return bytes(byte_array).decode("utf-8")

    def read_ascii_str(self, length: int) -> str:
        return self.read(length).decode("ASCII")

    def read_ascii_nt_str(self, nt: int = 0) -> str:
        byte_array = bytearray()
        while (byte := self.read_ubyte()) != nt:
            byte_array.append(byte)
        return bytes(byte_array).decode("ASCII")

    def align(self, number: int) -> int:
        offset = self.tell()
        align = (number - (offset % number)) % number
        return self.seek(offset + align)

An abstract base class for context managers.

Ancestors

  • contextlib.AbstractContextManager
  • abc.ABC

Methods

def align(self, number: int) ‑> int
Expand source code
def align(self, number: int) -> int:
    offset = self.tell()
    align = (number - (offset % number)) % number
    return self.seek(offset + align)
def close(self)
Expand source code
def close(self):
    return self.fp.close()
def open(self) ‑> Self
Expand source code
def open(self) -> Self:
    self.fp = open(self.file_path, "rb")
    return self
def read(self, number: int) ‑> bytes
Expand source code
def read(self, number: int) -> bytes:
    return self.fp.read(number)
def read_ascii_nt_str(self, nt: int = 0) ‑> str
Expand source code
def read_ascii_nt_str(self, nt: int = 0) -> str:
    byte_array = bytearray()
    while (byte := self.read_ubyte()) != nt:
        byte_array.append(byte)
    return bytes(byte_array).decode("ASCII")
def read_ascii_str(self, length: int) ‑> str
Expand source code
def read_ascii_str(self, length: int) -> str:
    return self.read(length).decode("ASCII")
def read_i16(self) ‑> int
Expand source code
def read_i16(self) -> int:
    return self.unpack("h", 2)
def read_i32(self) ‑> int
Expand source code
def read_i32(self) -> int:
    return self.unpack("i", 4)
def read_i64(self) ‑> int
Expand source code
def read_i64(self) -> int:
    return self.unpack("q", 8)
def read_i8(self) ‑> int
Expand source code
def read_i8(self) -> int:
    return self.unpack("b", 1)
def read_u16(self) ‑> int
Expand source code
def read_u16(self) -> int:
    return self.unpack("H", 2)
def read_u32(self) ‑> int
Expand source code
def read_u32(self) -> int:
    return self.unpack("I", 4)
def read_u64(self) ‑> int
Expand source code
def read_u64(self) -> int:
    return self.unpack("Q", 8)
def read_u8(self) ‑> int
Expand source code
def read_u8(self) -> int:
    return self.unpack("B", 1)
def read_utf8_nt_str(self, nt: int = 0) ‑> str
Expand source code
def read_utf8_nt_str(self, nt: int = 0) -> str:
    byte_array = bytearray()
    while (byte := self.read_ubyte()) != nt:
        byte_array.append(byte)
    return bytes(byte_array).decode("utf-8")
def read_utf8_str(self, length: int) ‑> str
Expand source code
def read_utf8_str(self, length: int) -> str:
    return self.read(length).decode("utf-8")
def seek(self, offset: int) ‑> int
Expand source code
def seek(self, offset: int) -> int:
    return self.fp.seek(offset)
def skip(self, number: int) ‑> int
Expand source code
def skip(self, number: int) -> int:
    return self.seek(self.tell() + number)
def tell(self) ‑> int
Expand source code
def tell(self) -> int:
    return self.fp.tell()
def unpack(self, type: str, size: int) ‑> int
Expand source code
def unpack(self, type: str, size: int) -> int:
    return up(f"{self.endian.value}{type}", self.read(size))[0]
class BinaryWriter (file_path: pathlib.Path,
endian: BinaryEndian = BinaryEndian.LITTLE)
Expand source code
class BinaryWriter(AbstractContextManager):
    def __init__(self, file_path: Path, endian: BinaryEndian = BinaryEndian.LITTLE):
        self.endian = endian
        self.file_path = file_path
        self.fp = None

    def __enter__(self) -> Self:
        return self.open()

    def __exit__(self, *e):
        return self.close()

    def open(self) -> Self:
        self.fp = open(self.file_path, "wb")
        return self

    def close(self):
        return self.fp.close()

    def write(self, buffer: BinaryIO) -> int:
        return self.fp.write(buffer)

    def pack(self, type: str, number: int) -> int:
        return self.write(pk(f"{self.endian.value}{type}", number))

    def write_u8(self, number: int) -> int:
        return self.pack("B", number)

    def write_i8(self, number: int) -> int:
        return self.pack("b", number)

    def write_u16(self, number: int) -> int:
        return self.pack("H", number)

    def write_i16(self, number: int) -> int:
        return self.pack("h", number)

    def write_u32(self, number: int) -> int:
        return self.pack("I", number)

    def write_i32(self, number: int) -> int:
        return self.pack("i", number)

    def write_u64(self, number: int) -> int:
        return self.pack("Q", number)

    def write_i64(self, number: int) -> int:
        return self.pack("q", number)

    def write_utf8_str(self, string: str) -> int:
        return self.write(string.encode("utf-8"))

    def write_utf8_nt_str(self, string: str, nt: int = 0) -> int:
        return self.write_utf8_str(string) + self.write_ubyte(nt)

    def write_ascii_str(self, string: str) -> int:
        return self.write(string.encode("ASCII"))

    def write_ascii_nt_str(self, string: str, nt: int = 0) -> int:
        return self.write_ascii_str(string) + self.write_ubyte(nt)

    def align(self, number: int) -> int:
        offset = self.tell()
        align = (number - (offset % number)) % number
        return self.seek(offset + align)

    def skip(self, number: int) -> int:
        return self.seek(self.tell() + number)

An abstract base class for context managers.

Ancestors

  • contextlib.AbstractContextManager
  • abc.ABC

Methods

def align(self, number: int) ‑> int
Expand source code
def align(self, number: int) -> int:
    offset = self.tell()
    align = (number - (offset % number)) % number
    return self.seek(offset + align)
def close(self)
Expand source code
def close(self):
    return self.fp.close()
def open(self) ‑> Self
Expand source code
def open(self) -> Self:
    self.fp = open(self.file_path, "wb")
    return self
def pack(self, type: str, number: int) ‑> int
Expand source code
def pack(self, type: str, number: int) -> int:
    return self.write(pk(f"{self.endian.value}{type}", number))
def skip(self, number: int) ‑> int
Expand source code
def skip(self, number: int) -> int:
    return self.seek(self.tell() + number)
def write(self, buffer: ) ‑> int
Expand source code
def write(self, buffer: BinaryIO) -> int:
    return self.fp.write(buffer)
def write_ascii_nt_str(self, string: str, nt: int = 0) ‑> int
Expand source code
def write_ascii_nt_str(self, string: str, nt: int = 0) -> int:
    return self.write_ascii_str(string) + self.write_ubyte(nt)
def write_ascii_str(self, string: str) ‑> int
Expand source code
def write_ascii_str(self, string: str) -> int:
    return self.write(string.encode("ASCII"))
def write_i16(self, number: int) ‑> int
Expand source code
def write_i16(self, number: int) -> int:
    return self.pack("h", number)
def write_i32(self, number: int) ‑> int
Expand source code
def write_i32(self, number: int) -> int:
    return self.pack("i", number)
def write_i64(self, number: int) ‑> int
Expand source code
def write_i64(self, number: int) -> int:
    return self.pack("q", number)
def write_i8(self, number: int) ‑> int
Expand source code
def write_i8(self, number: int) -> int:
    return self.pack("b", number)
def write_u16(self, number: int) ‑> int
Expand source code
def write_u16(self, number: int) -> int:
    return self.pack("H", number)
def write_u32(self, number: int) ‑> int
Expand source code
def write_u32(self, number: int) -> int:
    return self.pack("I", number)
def write_u64(self, number: int) ‑> int
Expand source code
def write_u64(self, number: int) -> int:
    return self.pack("Q", number)
def write_u8(self, number: int) ‑> int
Expand source code
def write_u8(self, number: int) -> int:
    return self.pack("B", number)
def write_utf8_nt_str(self, string: str, nt: int = 0) ‑> int
Expand source code
def write_utf8_nt_str(self, string: str, nt: int = 0) -> int:
    return self.write_utf8_str(string) + self.write_ubyte(nt)
def write_utf8_str(self, string: str) ‑> int
Expand source code
def write_utf8_str(self, string: str) -> int:
    return self.write(string.encode("utf-8"))
class MemoryWriter (endian: BinaryEndian = BinaryEndian.LITTLE)
Expand source code
class MemoryWriter(BytesIO):
    def __init__(self, endian: BinaryEndian = BinaryEndian.LITTLE):
        self.endian = endian

    def pack(self, type: str, number: int) -> int:
        return self.write(pk(f"{self.endian.value}{type}", number))

    def write_u8(self, number: int) -> int:
        return self.pack("B", number)

    def write_i8(self, number: int) -> int:
        return self.pack("b", number)

    def write_u16(self, number: int) -> int:
        return self.pack("H", number)

    def write_i16(self, number: int) -> int:
        return self.pack("h", number)

    def write_u32(self, number: int) -> int:
        return self.pack("I", number)

    def write_i32(self, number: int) -> int:
        return self.pack("i", number)

    def write_u64(self, number: int) -> int:
        return self.pack("Q", number)

    def write_i64(self, number: int) -> int:
        return self.pack("q", number)

    def write_utf8_str(self, string: str) -> int:
        return self.write(string.encode("utf-8"))

    def write_utf8_nt_str(self, string: str, nt: int = 0) -> int:
        return self.write_utf8_str(string) + self.write_ubyte(nt)

    def write_ascii_str(self, string: str) -> int:
        return self.write(string.encode("ASCII"))

    def write_ascii_nt_str(self, string: str, nt: int = 0) -> int:
        return self.write_ascii_str(string) + self.write_ubyte(nt)

    def align(self, number: int) -> int:
        offset = self.tell()
        align = (number - (offset % number)) % number
        return self.seek(offset + align)

    def skip(self, number: int) -> int:
        return self.seek(self.tell() + number)

Buffered I/O implementation using an in-memory bytes buffer.

Ancestors

  • _io.BytesIO
  • _io._BufferedIOBase
  • _io._IOBase

Methods

def align(self, number: int) ‑> int
Expand source code
def align(self, number: int) -> int:
    offset = self.tell()
    align = (number - (offset % number)) % number
    return self.seek(offset + align)
def pack(self, type: str, number: int) ‑> int
Expand source code
def pack(self, type: str, number: int) -> int:
    return self.write(pk(f"{self.endian.value}{type}", number))
def skip(self, number: int) ‑> int
Expand source code
def skip(self, number: int) -> int:
    return self.seek(self.tell() + number)
def write_ascii_nt_str(self, string: str, nt: int = 0) ‑> int
Expand source code
def write_ascii_nt_str(self, string: str, nt: int = 0) -> int:
    return self.write_ascii_str(string) + self.write_ubyte(nt)
def write_ascii_str(self, string: str) ‑> int
Expand source code
def write_ascii_str(self, string: str) -> int:
    return self.write(string.encode("ASCII"))
def write_i16(self, number: int) ‑> int
Expand source code
def write_i16(self, number: int) -> int:
    return self.pack("h", number)
def write_i32(self, number: int) ‑> int
Expand source code
def write_i32(self, number: int) -> int:
    return self.pack("i", number)
def write_i64(self, number: int) ‑> int
Expand source code
def write_i64(self, number: int) -> int:
    return self.pack("q", number)
def write_i8(self, number: int) ‑> int
Expand source code
def write_i8(self, number: int) -> int:
    return self.pack("b", number)
def write_u16(self, number: int) ‑> int
Expand source code
def write_u16(self, number: int) -> int:
    return self.pack("H", number)
def write_u32(self, number: int) ‑> int
Expand source code
def write_u32(self, number: int) -> int:
    return self.pack("I", number)
def write_u64(self, number: int) ‑> int
Expand source code
def write_u64(self, number: int) -> int:
    return self.pack("Q", number)
def write_u8(self, number: int) ‑> int
Expand source code
def write_u8(self, number: int) -> int:
    return self.pack("B", number)
def write_utf8_nt_str(self, string: str, nt: int = 0) ‑> int
Expand source code
def write_utf8_nt_str(self, string: str, nt: int = 0) -> int:
    return self.write_utf8_str(string) + self.write_ubyte(nt)
def write_utf8_str(self, string: str) ‑> int
Expand source code
def write_utf8_str(self, string: str) -> int:
    return self.write(string.encode("utf-8"))