Files
skate-3-rust-engine/tools/owned_game/binary.py
T

41 lines
1.2 KiB
Python

from __future__ import annotations
import struct
class FormatError(ValueError):
"""Raised when an owned input is malformed or outside supported bounds."""
class Reader:
def __init__(self, data: bytes, label: str = "input"):
self.data = data
self.label = label
def require(self, offset: int, size: int) -> None:
if offset < 0 or size < 0 or offset > len(self.data) - size:
raise FormatError(
f"{self.label}: range {offset:#x}+{size:#x} is outside "
f"{len(self.data):#x} bytes"
)
def bytes(self, offset: int, size: int) -> bytes:
self.require(offset, size)
return self.data[offset : offset + size]
def u8(self, offset: int) -> int:
self.require(offset, 1)
return self.data[offset]
def u16be(self, offset: int) -> int:
self.require(offset, 2)
return struct.unpack_from(">H", self.data, offset)[0]
def u32be(self, offset: int) -> int:
self.require(offset, 4)
return struct.unpack_from(">I", self.data, offset)[0]
def align(value: int, alignment: int) -> int:
return (value + alignment - 1) & ~(alignment - 1)