add more output formats

This commit is contained in:
Florian Stecker 2025-10-11 23:24:43 -04:00
parent 279fea7276
commit f2ebb049e4

View File

@ -3,6 +3,7 @@ import argparse
import plyvel import plyvel
import iavltree import iavltree
import json import json
import struct
def decode_protobuf(subformats: dict, format_prefix: str, data: bytes): def decode_protobuf(subformats: dict, format_prefix: str, data: bytes):
result = [] result = []
@ -10,18 +11,12 @@ def decode_protobuf(subformats: dict, format_prefix: str, data: bytes):
idx = f'{format_prefix}.{k}' idx = f'{format_prefix}.{k}'
if idx in subformats: if idx in subformats:
f = subformats[idx] f = subformats[idx]
if f == 'str': if f == 'proto':
decoded_value = v.decode('utf-8')
elif f == 'int':
decoded_value = int(v)
elif f == 'float':
decoded_value = float(v)
elif f == 'proto':
decoded_value = decode_protobuf(subformats, idx, v) decoded_value = decode_protobuf(subformats, idx, v)
elif f == 'protodict': elif f == 'protodict':
decoded_value = dict(decode_protobuf(subformats, idx, v)) decoded_value = dict(decode_protobuf(subformats, idx, v))
else: else:
decoded_value = v decoded_value = decode_output(f, v)
else: else:
decoded_value = v decoded_value = v
result.append((k, decoded_value)) result.append((k, decoded_value))
@ -34,6 +29,30 @@ def decode_output(format: str, data: bytes) -> str:
return int(data) return int(data)
elif format == 'float': elif format == 'float':
return float(data) 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'): elif format.startswith('protodict'):
subformats = {'.' + id: subformat for x in format.split(',')[1:] for id, subformat in (x.split('='),)} subformats = {'.' + id: subformat for x in format.split(',')[1:] for id, subformat in (x.split('='),)}
return dict(decode_protobuf(subformats, '', data)) return dict(decode_protobuf(subformats, '', data))