tlv解析 发表于 2024-04-10 | 分类于 tutorial 12345678910111213141516171819202122232425262728293031323334353637def 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()