|
1 | 1 | import io
|
| 2 | +import struct |
2 | 3 | from typing import Literal
|
3 | 4 |
|
4 | 5 |
|
5 |
| -class Reader(io.BytesIO): |
| 6 | +class Reader: |
6 | 7 | def __init__(
|
7 | 8 | self,
|
8 | 9 | initial_buffer: bytes = b"",
|
9 | 10 | endian: Literal["little", "big"] = "little",
|
10 | 11 | ):
|
11 |
| - super().__init__(initial_buffer) |
| 12 | + self._internal_reader = io.BytesIO(initial_buffer) |
| 13 | + |
12 | 14 | self.endian: Literal["little", "big"] = endian
|
| 15 | + self.endian_sign: Literal["<", ">"] = "<" if endian == "little" else ">" |
| 16 | + |
| 17 | + def seek(self, position: int) -> None: |
| 18 | + self._internal_reader.seek(position) |
13 | 19 |
|
14 |
| - def read_integer(self, length: int, signed=False) -> int: |
15 |
| - return int.from_bytes(self.read(length), self.endian, signed=signed) |
| 20 | + def tell(self) -> int: |
| 21 | + return self._internal_reader.tell() |
| 22 | + |
| 23 | + def read(self, size: int) -> bytes: |
| 24 | + return self._internal_reader.read(size) |
16 | 25 |
|
17 | 26 | def read_uchar(self) -> int:
|
18 |
| - return self.read_integer(1) |
| 27 | + return struct.unpack("B", self.read(1))[0] |
19 | 28 |
|
20 | 29 | def read_char(self) -> int:
|
21 |
| - return self.read_integer(1, True) |
| 30 | + return struct.unpack("b", self.read(1))[0] |
22 | 31 |
|
23 | 32 | def read_ushort(self) -> int:
|
24 |
| - return self.read_integer(2) |
| 33 | + return struct.unpack(f"{self.endian_sign}H", self.read(2))[0] |
25 | 34 |
|
26 | 35 | def read_short(self) -> int:
|
27 |
| - return self.read_integer(2, True) |
| 36 | + return struct.unpack(f"{self.endian_sign}h", self.read(2))[0] |
28 | 37 |
|
29 | 38 | def read_uint(self) -> int:
|
30 |
| - return self.read_integer(4) |
| 39 | + return struct.unpack(f"{self.endian_sign}I", self.read(4))[0] |
31 | 40 |
|
32 | 41 | def read_int(self) -> int:
|
33 |
| - return self.read_integer(4, True) |
| 42 | + return struct.unpack(f"{self.endian_sign}i", self.read(4))[0] |
34 | 43 |
|
35 | 44 | def read_twip(self) -> float:
|
36 | 45 | return self.read_int() / 20
|
@@ -72,6 +81,7 @@ def write_string(self, string: str | None = None):
|
72 | 81 | if string is None:
|
73 | 82 | self.write_byte(0xFF)
|
74 | 83 | return
|
| 84 | + |
75 | 85 | encoded = string.encode()
|
76 | 86 | self.write_byte(len(encoded))
|
77 | 87 | self.write(encoded)
|
0 commit comments