From f2ebb049e4395649e3f218c7c8b75cb1e1a51aa3 Mon Sep 17 00:00:00 2001 From: Florian Stecker Date: Sat, 11 Oct 2025 23:24:43 -0400 Subject: [PATCH] add more output formats --- iavlread | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/iavlread b/iavlread index f623a17..3a50b6d 100755 --- a/iavlread +++ b/iavlread @@ -3,6 +3,7 @@ import argparse import plyvel import iavltree import json +import struct def decode_protobuf(subformats: dict, format_prefix: str, data: bytes): result = [] @@ -10,18 +11,12 @@ def decode_protobuf(subformats: dict, format_prefix: str, data: bytes): idx = f'{format_prefix}.{k}' if idx in subformats: f = subformats[idx] - if f == 'str': - decoded_value = v.decode('utf-8') - elif f == 'int': - decoded_value = int(v) - elif f == 'float': - decoded_value = float(v) - elif f == 'proto': + if f == 'proto': decoded_value = decode_protobuf(subformats, idx, v) elif f == 'protodict': decoded_value = dict(decode_protobuf(subformats, idx, v)) else: - decoded_value = v + decoded_value = decode_output(f, v) else: decoded_value = v result.append((k, decoded_value)) @@ -34,6 +29,30 @@ def decode_output(format: str, data: bytes) -> str: return int(data) elif format == 'float': return float(data) + elif format == 'u64': + return struct.unpack('>Q', data[:8])[0] + elif format == 'u32': + return struct.unpack('>I', data[:4])[0] + elif format == 'u16': + return struct.unpack('>H', data[:4])[0] + elif format == 'u8': + return struct.unpack('>B', data[:4])[0] + elif format == 'i64': + return struct.unpack('>q', data[:8])[0] + elif format == 'i32': + return struct.unpack('>i', data[:4])[0] + elif format == 'i16': + return struct.unpack('>h', data[:4])[0] + elif format == 'i8': + return struct.unpack('>b', data[:4])[0] + elif format == 'i64ord': + return struct.unpack('>Q', data[:8])[0] - (1<<63) + elif format == 'i32ord': + return struct.unpack('>I', data[:4])[0] - (1<<31) + elif format == 'i16ord': + return struct.unpack('>H', data[:4])[0] - (1<<15) + elif format == 'i8ord': + return struct.unpack('>B', data[:4])[0] - (1<<7) elif format.startswith('protodict'): subformats = {'.' + id: subformat for x in format.split(',')[1:] for id, subformat in (x.split('='),)} return dict(decode_protobuf(subformats, '', data))