Source code for winregrc.hexdump

"""Function to provide hexadecimal representation of data."""

_HEXDUMP_CHARACTER_MAP = [
    "." if byte < 0x20 or byte > 0x7E else chr(byte) for byte in range(256)
]


[docs] def Hexdump(data): """Formats data in a hexadecimal representation. Args: data (byte): data. Returns: str: hexadecimal representation of the data. """ in_group = False previous_hexadecimal_string = None lines = [] data_size = len(data) for block_index in range(0, data_size, 16): data_string = data[block_index : block_index + 16] hexadecimal_byte_values = [] printable_values = [] for byte_value in data_string: if isinstance(byte_value, str): byte_value = ord(byte_value) hexadecimal_byte_values.append(f"{byte_value:02x}") printable_value = _HEXDUMP_CHARACTER_MAP[byte_value] printable_values.append(printable_value) remaining_size = 16 - len(data_string) if remaining_size == 0: whitespace = "" elif remaining_size >= 8: whitespace = " " * ((3 * remaining_size) - 1) else: whitespace = " " * (3 * remaining_size) hexadecimal_string_part1 = " ".join(hexadecimal_byte_values[0:8]) hexadecimal_string_part2 = " ".join(hexadecimal_byte_values[8:16]) hexadecimal_string = ( f"{hexadecimal_string_part1:s} {hexadecimal_string_part2:s}" f"{whitespace:s}" ) if ( previous_hexadecimal_string is not None and previous_hexadecimal_string == hexadecimal_string and block_index + 16 < data_size ): if not in_group: in_group = True lines.append("...") else: printable_string = "".join(printable_values) lines.append( f"0x{block_index:08x} {hexadecimal_string:s} {printable_string:s}" ) in_group = False previous_hexadecimal_string = hexadecimal_string lines.extend(["", ""]) return "\n".join(lines)