diff --git a/implementations/python/preserves/dissect.py b/implementations/python/preserves/dissect.py index fba326c..abc4bae 100644 --- a/implementations/python/preserves/dissect.py +++ b/implementations/python/preserves/dissect.py @@ -7,11 +7,16 @@ def dissect_items(body, position=0): (count, i) = decode_varint(body) chunk = body[i:i+count] body = body[i+count:] - result.append(dissect(chunk, position + i)) + result.append(_dissect(chunk, position + i)) position = position + i+count return result -def dissect(bs, position=0): +def dissect(bs): + if not isinstance(bs, memoryview): + bs = memoryview(bs) + return _dissect(bs, 0) + +def _dissect(bs, position): tag = bs[0] body = bs[1:] info = None @@ -23,23 +28,23 @@ def dissect(bs, position=0): elif tag in [0xA7, 0xA8, 0xA9, 0xBF]: kids = dissect_items(body, position+1) elif tag == 0xAB: - kids = [dissect(body, position+1)] + kids = [_dissect(body, position+1)] elif tag == 0xA2: if len(body) == 4: info = struct.unpack('>f', body)[0] if len(body) == 8: info = struct.unpack('>d', body)[0] elif tag == 0xA3: info = decode_int(body) elif tag == 0xA4: - info = body[:-1].decode('utf-8') + info = bytes(body[:-1]).decode('utf-8') elif tag == 0xA6: - info = body.decode('utf-8') + info = bytes(body).decode('utf-8') if kids is not None: return ((position, len(bs), tag), kids) elif info is not None: - return ((position, len(bs), tag), body, info) + return ((position, len(bs), tag), bytes(body), info) else: - return ((position, len(bs), tag), body) + return ((position, len(bs), tag), bytes(body)) if __name__ == '__main__': import sys