add more output formats
This commit is contained in:
parent
279fea7276
commit
f2ebb049e4
35
iavlread
35
iavlread
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user