File: iconify/tools/dump-ico.py

#!/usr/bin/python
# dump start of file in hex + parsed fields
# run directly, or via test_ALL

from __future__ import print_function
import sys, struct
if sys.version[0] == '2': input = raw_input
def cnv(x): return ord(x) if sys.version[0] == '2' else x

testico = sys.argv[1] if len(sys.argv) > 1 else 'test_icon'

# dump little-endian hex bytes
rawbytes = open(testico + '.ico', 'rb').read()
for i in range(80):
    print('%2X' % cnv(rawbytes[i]), end=' ')         # 2.X only: ord() for int
    if (i+1) % 20 == 0: print()

# dump human-readable fields
print('\nParsed fields:')
hdrfmt = "<hhh"         # hdr: 6 bytes
dirfmt = "<BBBBhhii"    # dir: 16 bytes each

# header
vals = struct.unpack(hdrfmt, rawbytes[0:6])
print('\treserved:  %s\n'
      '\tfiletype:  %s\n'
      '\tnumimages: %s' % vals)

# directory
rawbytes = rawbytes[6:]
for i in range(vals[2]):
    dirrec, rawbytes = rawbytes[:16], rawbytes[16:]
    vals = struct.unpack(dirfmt, dirrec)
    print('record %s:\n'
          '\twidth:     %s\n'
          '\theight:    %s\n'
          '\tcolors:    %s\n'
          '\treserved:  %s\n'
          '\tplanes:    %s\n'
          '\tbitspix:   %s\n'
          '\timgsize:   %s\n'
          '\timgoffset: %s\n' % ((i,) + vals))

input('Press Return to exit.')



[Home page] Books Code Blog Python Author Train Find ©M.Lutz