64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
|
import argparse
|
||
|
import sys
|
||
|
|
||
|
DEFAULT_WIDTH = 16
|
||
|
|
||
|
def hexy(i, width=0):
|
||
|
return hex(i)[2:].upper().rjust(width, '0')
|
||
|
|
||
|
def hexdump(handle, width=DEFAULT_WIDTH, ellipse=False, start=None, end=None):
|
||
|
if start is not None:
|
||
|
start = int(start, 16)
|
||
|
handle.seek(start)
|
||
|
address = start
|
||
|
else:
|
||
|
address = 0
|
||
|
if end is not None:
|
||
|
end = int(end, 16)
|
||
|
|
||
|
did_ellipse = False
|
||
|
previous_line = None
|
||
|
while True:
|
||
|
if end is not None:
|
||
|
if address > end:
|
||
|
break
|
||
|
this_width = min(width, end - address)
|
||
|
else:
|
||
|
this_width = width
|
||
|
line = handle.read(this_width)
|
||
|
if not line:
|
||
|
break
|
||
|
line = [hexy(x, 2) for x in line]
|
||
|
line = ' '.join(line)
|
||
|
if ellipse:
|
||
|
if line == previous_line:
|
||
|
if not did_ellipse:
|
||
|
print('...')
|
||
|
did_ellipse = True
|
||
|
address += width
|
||
|
continue
|
||
|
previous_line = line
|
||
|
print('%s | ' % hexy(address, 8), end='', flush=False)
|
||
|
print(line)
|
||
|
address += width
|
||
|
|
||
|
def hexdump_argparse(args):
|
||
|
handle = open(args.filename, 'rb')
|
||
|
return hexdump(handle, width=args.width, ellipse=args.ellipse, start=args.start, end=args.end)
|
||
|
|
||
|
def main(argv):
|
||
|
parser = argparse.ArgumentParser()
|
||
|
|
||
|
parser.add_argument('filename')
|
||
|
parser.add_argument('--width', dest='width', default=DEFAULT_WIDTH, type=int)
|
||
|
parser.add_argument('--start', dest='start', default=None)
|
||
|
parser.add_argument('--end', dest='end', default=None)
|
||
|
parser.add_argument('--ellipse', dest='ellipse', action='store_true')
|
||
|
parser.set_defaults(func=hexdump_argparse)
|
||
|
|
||
|
args = parser.parse_args(argv)
|
||
|
args.func(args)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main(sys.argv[1:])
|