mirror of
https://github.com/dgelessus/python-rsrcfork.git
synced 2024-11-12 10:06:52 +00:00
24 lines
992 B
Python
24 lines
992 B
Python
|
import typing
|
||
|
|
||
|
|
||
|
class DecompressError(Exception):
|
||
|
"""Raised when resource data decompression fails, because the data is invalid or the compression type is not supported."""
|
||
|
|
||
|
|
||
|
def _read_variable_length_integer(data: bytes, position: int) -> typing.Tuple[int, int]:
|
||
|
"""Read a variable-length integer starting at the given position in the data, and return the integer as well as the number of bytes consumed.
|
||
|
|
||
|
This variable-length integer format is used by the 0xfe codes in the compression formats used by 'dcmp' (0) and 'dcmp' (1).
|
||
|
"""
|
||
|
|
||
|
assert len(data) > position
|
||
|
if data[position] == 0xff:
|
||
|
assert len(data) > position + 4
|
||
|
return int.from_bytes(data[position+1:position+5], "big", signed=True), 5
|
||
|
elif data[position] >= 0x80:
|
||
|
assert len(data) > position + 1
|
||
|
data_modified = bytes([(data[position] - 0xc0) & 0xff, data[position+1]])
|
||
|
return int.from_bytes(data_modified, "big", signed=True), 2
|
||
|
else:
|
||
|
return int.from_bytes(data[position:position+1], "big", signed=True), 1
|