Skip to content

Commit 979e529

Browse files
committed
simple stream performance improvement
use (un)pack instead of struct.(un)pack
1 parent 585ac21 commit 979e529

2 files changed

Lines changed: 34 additions & 26 deletions

File tree

UnityPy/streams/EndianBinaryReader.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import io
2-
import struct
2+
from struct import unpack
33

44
from ..math import Color, Matrix4x4, Quaternion, Vector2, Vector3, Vector4, Rectangle
55

@@ -36,46 +36,46 @@ def read(self, *args):
3636
return b""
3737

3838
def read_byte(self) -> int:
39-
return struct.unpack(self.endian + "b", self.read(1))[0]
39+
return unpack(self.endian + "b", self.read(1))[0]
4040

4141
def read_u_byte(self) -> int:
42-
return struct.unpack(self.endian + "B", self.read(1))[0]
42+
return unpack(self.endian + "B", self.read(1))[0]
4343

4444
def read_bytes(self, num) -> bytes:
4545
return self.read(num)
4646

4747
def read_short(self) -> int:
48-
return struct.unpack(self.endian + "h", self.read(2))[0]
48+
return unpack(self.endian + "h", self.read(2))[0]
4949

5050
def read_int(self) -> int:
51-
return struct.unpack(self.endian + "i", self.read(4))[0]
51+
return unpack(self.endian + "i", self.read(4))[0]
5252

5353
def read_long(self) -> int:
54-
return struct.unpack(self.endian + "q", self.read(8))[0]
54+
return unpack(self.endian + "q", self.read(8))[0]
5555

5656
def read_u_short(self) -> int:
57-
return struct.unpack(self.endian + "H", self.read(2))[0]
57+
return unpack(self.endian + "H", self.read(2))[0]
5858

5959
def read_u_int(self) -> int:
60-
return struct.unpack(self.endian + "I", self.read(4))[0]
60+
return unpack(self.endian + "I", self.read(4))[0]
6161

6262
def read_u_long(self) -> int:
63-
return struct.unpack(self.endian + "Q", self.read(8))[0]
63+
return unpack(self.endian + "Q", self.read(8))[0]
6464

6565
def read_float(self) -> float:
66-
return struct.unpack(self.endian + "f", self.read(4))[0]
66+
return unpack(self.endian + "f", self.read(4))[0]
6767

6868
def read_double(self) -> float:
69-
return struct.unpack(self.endian + "d", self.read(8))[0]
69+
return unpack(self.endian + "d", self.read(8))[0]
7070

7171
def read_boolean(self) -> bool:
72-
return bool(struct.unpack(self.endian + "?", self.read(1))[0])
72+
return bool(unpack(self.endian + "?", self.read(1))[0])
7373

7474
def read_string(self, size=None, encoding="utf8") -> str:
7575
if size is None:
7676
ret = self.read_string_to_null()
7777
else:
78-
ret = struct.unpack(f"{self.endian}{size}is", self.read(size))[0]
78+
ret = unpack(f"{self.endian}{size}is", self.read(size))[0]
7979
try:
8080
return ret.decode(encoding)
8181
except UnicodeDecodeError:
@@ -218,7 +218,6 @@ class EndianBinaryReader_Streamable(EndianBinaryReader):
218218

219219
def __init__(self, stream, endian=">", offset=0):
220220
self.stream = stream
221-
self.Length = self.stream.seek(0, 2) - offset
222221
super().__init__(stream, endian=endian, offset=offset)
223222

224223
def get_position(self):
@@ -227,6 +226,13 @@ def get_position(self):
227226
def set_position(self, value):
228227
self.stream.seek(value+self.BaseOffset)
229228

229+
@property
230+
def Length(self):
231+
pos = self.Position
232+
length = self.stream.seek(0, 2) - self.BaseOffset
233+
self.Position = pos
234+
return length
235+
230236
Position = property(get_position, set_position)
231237

232238
@property

UnityPy/streams/EndianBinaryWriter.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import io
2-
import struct
2+
from struct import pack
33

44
from ..math import Color, Matrix4x4, Quaternion, Vector2, Vector3, Vector4, Rectangle
55

@@ -14,6 +14,8 @@ def __init__(self, input_=b"", endian=">"):
1414
if isinstance(input_, (bytes, bytearray)):
1515
self.stream = io.BytesIO(input_)
1616
self.stream.seek(0, 2)
17+
elif isinstance(input_, io.IOBase):
18+
self.stream = input_
1719
else:
1820
raise ValueError("Invalid input type - %s." % type(input_))
1921
self.endian = endian
@@ -44,40 +46,40 @@ def write(self, *args):
4446
return ret
4547

4648
def write_byte(self, value: int):
47-
self.write(struct.pack(self.endian + "b", value))
49+
self.write(pack(self.endian + "b", value))
4850

4951
def write_u_byte(self, value: int):
50-
self.write(struct.pack(self.endian + "B", value))
52+
self.write(pack(self.endian + "B", value))
5153

5254
def write_bytes(self, value: bytes):
5355
return self.write(value)
5456

5557
def write_short(self, value: int):
56-
self.write(struct.pack(self.endian + "h", value))
58+
self.write(pack(self.endian + "h", value))
5759

5860
def write_int(self, value: int):
59-
self.write(struct.pack(self.endian + "i", value))
61+
self.write(pack(self.endian + "i", value))
6062

6163
def write_long(self, value: int):
62-
self.write(struct.pack(self.endian + "q", value))
64+
self.write(pack(self.endian + "q", value))
6365

6466
def write_u_short(self, value: int):
65-
self.write(struct.pack(self.endian + "H", value))
67+
self.write(pack(self.endian + "H", value))
6668

6769
def write_u_int(self, value: int):
68-
self.write(struct.pack(self.endian + "I", value))
70+
self.write(pack(self.endian + "I", value))
6971

7072
def write_u_long(self, value: int):
71-
self.write(struct.pack(self.endian + "Q", value))
73+
self.write(pack(self.endian + "Q", value))
7274

7375
def write_float(self, value: float):
74-
self.write(struct.pack(self.endian + "f", value))
76+
self.write(pack(self.endian + "f", value))
7577

7678
def write_double(self, value: float):
77-
self.write(struct.pack(self.endian + "d", value))
79+
self.write(pack(self.endian + "d", value))
7880

7981
def write_boolean(self, value: bool):
80-
self.write(struct.pack(self.endian + "?", value))
82+
self.write(pack(self.endian + "?", value))
8183

8284
def write_string_to_null(self, value: str):
8385
self.write(value.encode("utf8", "surrogateescape"))

0 commit comments

Comments
 (0)