tlv解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def parse_buf(data, depth):
    format = Struct(
        "length" / Int16ub,
        "tag" / Int16ub,
        "data" / Bytes(this.length - 4),
    )
    while len(data) > 0:   
        pkt = format.parse(data)
        data = data[pkt.length:]
        parse_pkt(pkt, depth)
    
def parse_pkt(pkt, depth):
    if pkt.length == 4:
        print('%s.AddTag(%d);' % ('\t' * depth, pkt.tag))
    elif pkt.length == 5:
        print('%s.AddInt8(%d, %d);' % ('\t' * depth, pkt.tag, int.from_bytes(pkt.data, 'big')))
    elif pkt.length == 6:
        print('%s.AddInt16BE(%d, %d);' % ('\t' * depth, pkt.tag, int.from_bytes(pkt.data, 'big')))
    elif pkt.length == 8:
        print('%s.AddInt32BE(%d, %d);' % ('\t' * depth, pkt.tag, int.from_bytes(pkt.data, 'big')))
    elif pkt.length == 12:
        print('%s.AddInt64BE(%d, %d);' % ('\t' * depth, pkt.tag, int.from_bytes(pkt.data, 'big')))
    elif pkt.tag in [0,1,2]:
        print('------------------------------')
        parse_buf(pkt.data, depth + 1)
    else:
        print('.AddString(%d, %s);' % (pkt.tag, pkt.data.decode('utf8')))
        
def test4():
    data = bytes([
        0x00, 0x06, 0x00, 0x00, 0x04, 0x57,
        0x00, 0x04, 0x00, 0x01
    ])
    
    parse_buf(data, 0)
    
test4()