if __name__ == "__main__": import sys; file = open(sys.argv[1], 'rb'); try: data = file.read(); finally: file.close(); base_addresses_counts = {}; results_count = 0; for line in data.split('\r\n'): if not line: continue; results_count += 1; base_address = int(line[18:], 16); if base_address not in base_addresses_counts: base_addresses_counts[base_address] = 1; else: base_addresses_counts[base_address] += 1; base_addresses = base_addresses_counts.keys(); base_addresses.sort(); lowest_base_address = base_addresses[0]; highest_base_address = base_addresses[-1]; smallest_delta = highest_base_address - lowest_base_address; previous_base_address = None; print ' Base | Offset | Delta | Count '; print '-------------|-------------|-------------|--------------'; for base_address in base_addresses: offset = base_address - lowest_base_address; if previous_base_address is not None: delta = base_address - previous_base_address; if delta < smallest_delta: smallest_delta = delta; else: delta = 0; print ' %11s | %11s | %11s | %d' % ( \ '0x%08X' % base_address, '+0x%X' % offset, '+0x%X' % delta, \ base_addresses_counts[base_address]); previous_base_address = base_address; print '-------------\'-------------\'-------------\'--------------'; print ' Total runs: %d' % results_count; print ' Total different values: %d' % len(base_addresses); print ' Smallest delta: 0x%X' % smallest_delta; print ' Total possible values: >= %(v)d (%(v)X)' % {'v': offset / smallest_delta};