1
1
import lzma
2
2
3
3
from sc_compression .exceptions import UnknownFileMagicException
4
- from sc_compression .signatures import Signatures , get_signature , MAGIC_SC , MAGIC_ZSTD , MAGIC_SCLZ
5
- from sc_compression .utils .reader import Reader
4
+ from sc_compression .signatures import (
5
+ Signatures ,
6
+ get_signature ,
7
+ MAGIC_SC ,
8
+ MAGIC_ZSTD ,
9
+ MAGIC_SCLZ ,
10
+ )
11
+ from sc_compression .utils import ByteReader
6
12
7
13
try :
8
14
import lzham
@@ -33,38 +39,39 @@ def decompress(self, buffer: bytes) -> bytes:
33
39
return buffer
34
40
35
41
if self .signature == Signatures .SC :
36
- reader = Reader (buffer , "big" )
42
+ reader = ByteReader (buffer , "big" )
37
43
38
44
self .check_magic (MAGIC_SC , reader = reader )
39
45
40
46
self .file_version = reader .read_int32 ()
41
47
if self .file_version == 4 :
42
48
self .file_version = reader .read_int32 ()
43
49
44
- if self .file_version == 0x05000000 :
45
- reader .endian = "little"
50
+ if self .file_version == 0x05000000 or self .file_version == 0x06000000 :
51
+ reader .set_endian ("little" )
52
+
53
+ if self .file_version == 0x06000000 :
54
+ reader .read_int16 ()
46
55
47
56
metadata_table_offset = reader .read_int32 () # offset to metadata vtable
48
57
reader .read (metadata_table_offset ) # metadata
49
58
else :
50
59
hash_length = reader .read_int32 ()
51
60
self .hash = reader .read (hash_length )
52
61
53
- return self .decompress (buffer [ reader .tell () :] )
62
+ return self .decompress (reader .read_all_bytes () )
54
63
elif self .signature == Signatures .SIG :
55
64
return self .decompress (buffer [68 :])
56
65
elif self .signature == Signatures .SCLZ and lzham is not None :
57
- reader = Reader (buffer , "little" )
66
+ reader = ByteReader (buffer , "little" )
58
67
59
68
self .check_magic (MAGIC_SCLZ , reader = reader )
60
69
61
70
dict_size_log2 = reader .read_u_int8 ()
62
71
uncompressed_size = reader .read_int32 ()
63
72
64
73
filters = {"dict_size_log2" : dict_size_log2 }
65
- return lzham .decompress (
66
- reader .buffer [reader .tell () :], uncompressed_size , filters
67
- )
74
+ return lzham .decompress (reader .read_all_bytes (), uncompressed_size , filters )
68
75
elif self .signature == Signatures .LZMA :
69
76
decompressor = lzma .LZMADecompressor ()
70
77
compressed = buffer [:5 ] + b"\xff " * 8 + buffer [9 :]
@@ -78,11 +85,15 @@ def decompress(self, buffer: bytes) -> bytes:
78
85
raise TypeError (self .signature )
79
86
80
87
@staticmethod
81
- def check_magic (expected_magic : bytes , reader : Reader | None = None , buffer : bytes | None = None ) -> None :
88
+ def check_magic (
89
+ expected_magic : bytes ,
90
+ reader : ByteReader | None = None ,
91
+ buffer : bytes | None = None ,
92
+ ) -> None :
82
93
if reader is not None :
83
94
magic = reader .read (len (expected_magic ))
84
95
elif buffer is not None :
85
- magic = buffer [:len (expected_magic )]
96
+ magic = buffer [: len (expected_magic )]
86
97
else :
87
98
raise Exception ("Cannot find buffer to get magic from." )
88
99
0 commit comments