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