diff --git a/osuRepy/helpers/typeSerializer.py b/osuRepy/helpers/typeSerializer.py index 12fec4b..7d87744 100644 --- a/osuRepy/helpers/typeSerializer.py +++ b/osuRepy/helpers/typeSerializer.py @@ -20,6 +20,30 @@ BYTEORDER_NATIVE = b"@" BYTEORDER_LITTLE = b"<" BYTEORDER_BIG = b">" +def encode_uleb(val): + data = b"" + pos = 0 + while val != 0: + b = val & 0x7f + val >>= 7 + if val != 0: + b |= 0x80 + data += bytes([b]) + return data + +def decode_uleb(data): + val = 0 + shift = 0 + pos = 0 + while True: + b = data[pos] + pos += 1 + val |= (b & 0x7f) << shift + if (b & 0x80) == 0: + break + shift += 7 + return val, pos + def guess_type(value): t_value = type(value) @@ -70,7 +94,7 @@ class Serializable: def get_value(self): def _get_value(): if self.type == TYPE_STRING: - return [11, bytes([len(self.value)]) + self.value] + return [0x0b, encode_uleb(len(self.value)) + self.value] return [self.value] val = _get_value() diff --git a/osuRepy/replay.py b/osuRepy/replay.py index c21dc43..bfcfbd0 100644 --- a/osuRepy/replay.py +++ b/osuRepy/replay.py @@ -32,7 +32,7 @@ def md5_file(file): return hash.hexdigest() def lzma_compress(data): - return bytes([len(data)]) + lzma.compress(data + b"-12345|0|0|1337,", format = lzma.FORMAT_ALONE, filters = [ + return encode_uleb(len(data)) + lzma.compress(data + b"-12345|0|0|1337,", format = lzma.FORMAT_ALONE, filters = [ { "id": lzma.FILTER_LZMA1, "preset": lzma.PRESET_DEFAULT, @@ -42,7 +42,7 @@ def lzma_compress(data): class Replay: _mode = Serializable(osuModes.STANDARD, TYPE_BYTE) - _osu_version = Serializable(20131216, TYPE_INT) + _osu_version = Serializable(20181216, TYPE_INT) _beatmap_hash = Serializable(b"d41d8cd98f00b204e9800998ecf8427e", TYPE_STRING) _player_name = Serializable(b"osu!", TYPE_STRING) _score_hash = Serializable(b"d41d8cd98f00b204e9800998ecf8427e", TYPE_STRING)