import struct,sys def rdU16(b,p): return struct.unpack_from('end: break ln = b[p] if lw==1 else (rdU16(b,p) if lw==2 else rdU32(b,p)) p+=lw if p+ln>end: break out.append((depth,idv,p,ln)) if idv in CONTAINERS: parse(b,p,p+ln,depth+1,out) p+=ln if idv==0x0005: break return fn=sys.argv[1] b=open(fn,'rb').read() assert b[:8]==b'DIV-BIZ2', b[:8] out=[] parse(b,8,len(b),0,out) for depth,idv,p,ln in out: nm=TAGNAME.get(idv,'?%04x'%idv) extra='' if idv==0x2008 or idv==0x0011 or idv==0x0028: s=b[p:p+ln].split(b'\0')[0].decode('latin1',errors='replace') extra=' "%s"'%s if idv==0x2037: # SV_SPECIAL s=b[p:p+ln].split(b'\0')[0].decode('latin1',errors='replace') extra=' SPECIAL="%s"'%s if idv==0x2030: # SV_F_MATERIAL s=b[p:p+ln].split(b'\0')[0].decode('latin1',errors='replace') extra=' MAT="%s" (len %d)'%(s,ln) if idv==0x0018 and ln>=1: extra=' slice=%d'%b[p] print(' '*depth + '%-14s off=0x%04x len=%d%s'%(nm,p,ln,extra))