xref: /btstack/tool/dump_tlv.py (revision b50405356dba963d08b5536899c9a5751f8ca370)
1#!/usr/bin/env python3
2# BlueKitchen GmbH (c) 2017
3
4# primitive dump for .tlv format
5
6import sys
7
8
9def read_net_32(f):
10    a = f.read(1)
11    if not a:
12        return -1
13    b = f.read(1)
14    if not b:
15        return -1
16    c = f.read(1)
17    if not c:
18        return -1
19    d = f.read(1)
20    if not d:
21        return -1
22    return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d)
23
24def format_tag(tag):
25    return ''.join([ '%c' % i if (i > 0x20 and i < 128) else '.'  for i in tag])
26
27def as_hex(data):
28    str_list = []
29    for byte in data:
30        str_list.append("{0:02x} ".format(byte))
31    return ''.join(str_list)
32
33
34if len(sys.argv) == 1:
35    print('Dump TLV file')
36    print('Copyright 2017, BlueKitchen GmbH')
37    print('')
38    print('Usage: ', sys.argv[0], 'file.tlv')
39    exit(0)
40
41infile = sys.argv[1]
42
43with open(infile, 'rb') as fin:
44    pos = 0
45    # check header
46    magic_0 = read_net_32(fin)
47    magic_1 = read_net_32(fin)
48    if magic_0 != 0x42547374 or magic_1 != 0x61636b00:
49        print("%x" % magic_0)
50        print("%x" % magic_1)
51        print("Not a valid BTstack .tlv file\n")
52        exit(0)
53    pos += 8
54    print("Valid .tlv file")
55    while True:
56        tag = fin.read(4)
57        if not tag:
58            break
59        pos += 4
60        len = read_net_32(fin)
61        pos += 4
62        packet = fin.read(len)
63        pos += len
64        print("'%s' (%s): %s" % (format_tag(tag), as_hex(tag)[0:11], as_hex(packet)))
65    print("Done")
66