为何自制Python hexdump脚本输出与xxd不符?求调整方案
修正你的Hexdump脚本以匹配xxd格式
我帮你梳理下问题,你的脚本主要有两个核心地方需要调整,才能和xxd的输出格式完全对齐。下面是修正后的完整代码,以及对应的改动说明:
修正后的代码
import sys import argparse parser = argparse.ArgumentParser() parser.add_argument("file", help="Input File") args = parser.parse_args() try: with open(args.file, 'rb') as infile: with open(args.file + ".dump", 'w') as outfile: offset = 0 while True: line = infile.read(16) if len(line) == 0: break # 处理十六进制部分:每两个字节为一组,统一大写显示 hex_groups = [] for i in range(0, len(line), 2): if i + 1 < len(line): hex_groups.append(f"{line[i]:02X}{line[i+1]:02X}") else: # 处理文件末尾不足2字节的情况,补空格对齐 hex_groups.append(f"{line[i]:02X} ") # 拆分前后8字节的组,保持和xxd一致的空格分隔 first_half = hex_groups[:4] second_half = hex_groups[4:] hex_str = " ".join(first_half) if second_half: hex_str += " " + " ".join(second_half) # 补全空格,确保十六进制部分长度统一(即使不足16字节) hex_str = hex_str.ljust(39) # 处理文本部分:只显示可打印ASCII,不可打印字符用.代替 text_part = '' for b in line: if 32 <= b <= 126: text_part += chr(b) else: text_part += '.' # 拼接最终输出行 output = f"{offset:08x}: {hex_str} {text_part}" print(output) outfile.write(output + '\n') offset += 16 except FileNotFoundError: print("Input File not found!!") except Exception as e: print(f"An error occurred: {e}")
关键改动说明
- 十六进制分组调整:
把原来单个字节拆分的逻辑改成每两个字节为一组,用大写十六进制显示(和xxd保持一致);同时拆分前后8字节的组,保留格式对齐的空格,还处理了文件末尾不足16字节的对齐问题。 - 文本显示修正:
替换了原来str(line)的方式,不再显示b''包裹的格式;只输出可打印ASCII字符(范围32-126),像换行符这类不可打印字符统一替换为.,完全匹配xxd的文本显示规则。 - 细节优化:
在偏移量的冒号后添加了空格,修正了格式细节;把通用的except改为具体的FileNotFoundError,同时保留其他异常的捕获,避免隐藏未知错误。
运行这个修正后的脚本,输出就会和你期望的xxd格式完全一致了。
内容的提问来源于stack exchange,提问作者Dilshan Lakshitha
相关产品推荐
相关产品推荐

