class hexdump: def __init__(self, buf, off=0): self.buf = buf self.off = off def __iter__(self): last_bs, last_line = None, None for i in range(0, len(self.buf), 16): bs = bytearray(self.buf[i : i + 16]) line = "{:08x} {:23} {:23} |{:16}|".format( self.off + i, " ".join(("{:02x}".format(x) for x in bs[:8])), " ".join(("{:02x}".format(x) for x in bs[8:])), "".join((chr(x) if 32 <= x < 127 else "." for x in bs)), ) if bs == last_bs: line = "*" if bs != last_bs or line != last_line: yield line last_bs, last_line = bs, line yield "{:08x}".format(self.off + len(self.buf)) def __str__(self): return "\n".join(self) def __repr__(self): return "\n".join(self)