8 r.append(ord(f.read(1)))
17 return r[0] << 8 | r[1]
21 return r[0] << 24 | r[1] << 16 | r[2] << 8 | r[3];
23 def require(f, data, what):
24 r = read(f, len(data))
33 print '%02x' % ord(f.read(1)),
38 f = open(sys.argv[1], 'rb')
40 require(f, [0xff, 0x4f], 'SOC')
41 require(f, [0xff, 0x51], 'SIZ')
43 print '\tlength', size
45 require(f, [0xff, 0x52], 'COD')
47 print '\tlength', size
48 coding_style = read_8(f)
49 print '\tcoding style %2x' % coding_style
50 print '\tprogression order',
62 print '\tlayers', read_16(f)
63 print '\tmulti-component transform', read_8(f)
65 print '\ttransform levels', levels
66 print '\tcode-block sizes %dx%d' % (read_8(f), read_8(f))
67 print '\tmode switches %2x' % read_8(f)
68 print '\twavelet transform',
71 print '9/7 irreversible'
73 print '5/3 reversible'
75 print '\tprecinct sizes ',
76 for i in range(0, levels + 1):
79 require(f, [0xff, 0x5C], 'QCD')
81 print '\tlength', size
82 dump(f, size - 2, 'QCD')
84 tile_part_length = None
91 print '\tlength', size
92 dump(f, size - 2, 'COC')
93 elif r == [0xff, 0x5c]:
96 print '\tlength', size
97 dump(f, size - 2, 'QCD')
98 elif r == [0xff, 0x5d]:
101 print '\tlength', size
102 dump(f, size - 2, 'QCC')
103 elif r == [0xff, 0x64]:
106 print '\tlength', size
107 dump(f, size - 2, 'COM')
108 elif r == [0xff, 0x55]:
111 print '\tlength', size
112 dump(f, size - 2, 'TLM')
113 elif r == [0xff, 0x90]:
116 print '\tlength', size
117 print '\ttile index', read_16(f)
118 tile_part_length = read_32(f)
119 print '\ttile-part length', tile_part_length
120 print '\ttile-part index', read_8(f)
121 print '\tnumber of tile-parts', read_8(f)
122 elif r == [0xff, 0x93]:
124 dump(f, tile_part_length - 14, 'SOD')
125 elif r == [0xff, 0xd9]: