mirror of
https://github.com/SK8-ENGINE/skate-3-rust-engine.git
synced 2026-10-27 19:54:40 +00:00
41 lines
1.2 KiB
Python
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)
|