From eb69ca56320712680097deb61cfa3efc3176b4e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 24 Jan 2025 15:34:46 +0100 Subject: [PATCH] Add `EndianIO.parse_pointer` function This is to parse in-memory pointer data bytes into an actual pointer value. --- blender_asset_tracer/blendfile/dna_io.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/blender_asset_tracer/blendfile/dna_io.py b/blender_asset_tracer/blendfile/dna_io.py index 918f2e4..d675b6b 100644 --- a/blender_asset_tracer/blendfile/dna_io.py +++ b/blender_asset_tracer/blendfile/dna_io.py @@ -129,6 +129,20 @@ class EndianIO: return cls.read_ulong(fileobj) raise ValueError("unsupported pointer size %d" % pointer_size) + @classmethod + def parse_pointer(cls, pointer_data: bytes): + """Parse bytes as a pointer value.""" + + pointer_size = len(pointer_data) + try: + typestruct = { + 4: cls.UINT, + 8: cls.ULONG, + }[pointer_size] + except KeyError: + raise ValueError("unsupported pointer size %d" % pointer_size) + return typestruct.unpack(pointer_data)[0] + @classmethod def write_pointer(cls, fileobj: typing.IO[bytes], pointer_size: int, value: int): """Write a pointer to a file."""