You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于二进制文件跳过前20字节后逐6字节读取输出十六进制的代码实现求助

解决二进制文件跳过前20字节后逐6字节输出十六进制的问题

我来帮你调整代码,实现忽略前20字节、后续每次读取6字节并输出带空格分隔的十六进制格式的需求。我们可以分几步修改你的现有代码:

关键修改点

  • 首先跳过文件前20字节:使用文件对象的seek()方法直接定位到第21字节的位置(因为字节索引从0开始,seek(20)会跳过前20个字节)
  • 循环读取6字节块:直到文件指针走到末尾,没有更多内容可读
  • 格式化输出:将每个字节转换为两位大写的十六进制字符串,并用空格分隔,匹配你期望的输出格式

修改后的完整代码

import sys
from os.path import getsize

target = './' + sys.argv[1]
# 使用只读二进制模式打开文件,避免误修改原文件
with open(target, 'rb') as f:
    file_size = getsize(target)
    print(f"Size : {file_size}")
    
    # 跳过前20字节,直接定位到后续数据的起始位置
    f.seek(20)
    
    # 循环读取6字节块,直到读完剩余内容
    while True:
        # 每次读取最多6字节,返回bytes对象
        chunk = f.read(6)
        if not chunk:
            # 没有更多内容可读时,退出循环
            break
        
        # 将每个字节格式化为两位大写十六进制,并用空格连接
        hex_str = ' '.join(f'{byte:02X}' for byte in chunk)
        print(hex_str, end=' ')

# 最后换行,让输出格式更整洁
print()

代码细节解释

  1. 跳过前20字节:f.seek(20)将文件指针移动到第20个字节之后,后续所有的read()操作都会从这里开始,完美实现忽略前20字节的需求
  2. 循环读取逻辑:f.read(6)每次最多读取6字节,当文件走到末尾时会返回空的bytes对象,此时触发break退出循环,不用担心读取超出文件大小的问题
  3. 格式化输出:通过生成器表达式遍历chunk中的每个字节,用f'{byte:02X}'将字节转为两位大写十六进制(不足两位自动补0),再用' '.join()拼接成带空格的字符串,最后用end=' '让所有输出连在一起,完全匹配你示例中的连续格式
  4. 模式优化:把原来的rb+改为rb只读模式,因为我们只需要读取文件内容,避免意外写入操作修改原文件

如果需要输出小写的十六进制,只需要把代码中的02X改成02x即可。

内容的提问来源于stack exchange,提问作者Sliced_ice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:04:10