solution_125.py

#!/usr/bin/python3
# ====================================================================
# hex dump
# ====================================================================

import os

READ_BYTE_CHUNK = 16


# --------------------------------------------------------------------
# ---- print a chunk of bytes in hex and ascii
# --------------------------------------------------------------------

def print_chunk(idx,byts):

    ln = len(byts)

    print(f'{idx:08} ',end='')

    for i in range(READ_BYTE_CHUNK):
        if i < ln:
            byt = byts[i]
            print(f'{byt:02x} ',end='')
        else:
            print('   ',end='')

    for i in range(READ_BYTE_CHUNK):
        if i < ln:
            byt = byts[i]
            if byt < 32 or byt > 126:    # un-printable byte/char
                bchr = '.'
            else:
                bchr = chr(byt)
        else:
            bchr = ' '
        print(bchr,end='')
        

    print()


# --------------------------------------------------------------------
# ---- print title
# --------------------------------------------------------------------

def print_title():
    
    title = '-offset- ' +\
            '--------------------- hex ---------------------' +\
            ' ---- ascii -----'

    print(title)


# --------------------------------------------------------------------
# ---- main
# --------------------------------------------------------------------

file_name = './faces/unknown_image.png'

chunks_output = 0

idx = 0

print()
print(f'file name: {file_name}')
print()

print_title()

with open(file_name, mode='rb') as bfile:

    ## ---- start somewhere in the file - EOF-24
    ##bfile.seek(-24,os.SEEK_END)

    while True:

        byts = bfile.read(READ_BYTE_CHUNK)

        if len(byts) == 0: break

        print_chunk(idx,byts)

        idx += READ_BYTE_CHUNK

        # ---- limit output for testing

        chunks_output += 1
        if chunks_output > 3: break