Source code for dk64_lib.binary_reader

[docs] class BinaryReader: """Read big-endian values from an immutable byte buffer.""" def __init__(self, data: bytes | bytearray | memoryview): self._data = memoryview(data) def __len__(self) -> int: return len(self._data) def read_at(self, offset: int, size: int) -> bytes: self._validate_range(offset, size) return self._data[offset : offset + size].tobytes() def slice(self, offset: int, size: int) -> memoryview: self._validate_range(offset, size) return self._data[offset : offset + size] def read_u8(self, offset: int) -> int: return self.read_at(offset, 1)[0] def read_u16(self, offset: int) -> int: return int.from_bytes(self.read_at(offset, 2), "big") def read_i16(self, offset: int) -> int: return int.from_bytes(self.read_at(offset, 2), "big", signed=True) def read_u32(self, offset: int) -> int: return int.from_bytes(self.read_at(offset, 4), "big") def _validate_range(self, offset: int, size: int) -> None: if offset < 0: raise ValueError("offset must be non-negative") if size < 0: raise ValueError("size must be non-negative") if offset + size > len(self._data): raise ValueError("read exceeds buffer length")