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

读取二进制固件寻找小端序0-15的16位整数序列问题排查

问题1:初始代码错误分析与修复

错误原因

报错ValueError: Unknown format code 'x' for object of type 'str'的直接原因是:

  • i = b.hex()将单个字节转换为十六进制字符串(比如字节0x01会变成字符串'01')
  • 后续f'{i:x}'试图对字符串使用整数专属的x格式符,这是不合法的,因此抛出错误。

除此之外,初始代码还存在多处逻辑错误:

  • allowed被定义为整数集合,但后续循环将val转为bytes后未更新集合,导致b in allowed永远为False
  • 遍历单个字节而非小端32位整数(每4字节为一个单位),完全偏离目标需求
  • N=16是目标整数的个数,对应字节数应为16*4=64,代码中取s[index:index+N]是取16个字节,逻辑完全错误

正确实现代码

直接将二进制文件解析为小端32位整数数组,再遍历查找连续16个符合0-15范围的序列:

import struct

with open("firm.bin", 'rb') as f:
    data = f.read()

# 将二进制数据解析为小端32位无符号整数数组
int_count = len(data) // 4
integers = [struct.unpack('<I', data[i*4:(i+1)*4])[0] for i in range(int_count)]

target_length = 16
allowed_range = range(0, 16)  # 0-15的整数

for idx in range(len(integers) - target_length + 1):
    window = integers[idx:idx+target_length]
    # 检查窗口内所有整数都在0-15范围内
    if all(num in allowed_range for num in window):
        # 计算字节偏移:每个整数占4字节
        byte_offset = idx * 4
        print(f"Found valid sequence at byte offset {byte_offset}: {window}")

问题2:Numpy方案的问题排查与修正

问题原因

  1. 切片为空:你的测试数组a1D长度为16,使用np.convolve(..., mode='same')得到的结果长度同样为16。后续[8:-8]切片等价于从索引8到索引8(因为负数索引-8对应正向索引16-8=8),最终得到空数组,因此np.where返回空结果。
  2. 卷积逻辑不合理:通过求和判断的方式不准确,即使和小于16*15,也不能保证每个元素都在0-15范围内(比如存在一个16和15个0,和为16也小于240,但不符合要求)。

修正后的Numpy代码

直接使用滑动窗口检查连续元素是否全部在0-15范围内:

import numpy as np

# 测试用数组
a1D = np.array([1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11, 13, 12, 14, 15, 0], dtype=np.uint32)
# 从文件读取的话用下面这行:
# a1D = np.fromfile('firm.ori', dtype=np.uint32)

target_length = 16
# 检查数组长度是否足够
if len(a1D) >= target_length:
    # 创建滑动窗口视图
    windows = np.lib.stride_tricks.sliding_window_view(a1D, window_shape=target_length)
    # 检查每个窗口内所有元素都在0-15之间
    valid_mask = np.all((windows >= 0) & (windows <= 15), axis=1)
    # 获取有效窗口的起始索引
    valid_indices = np.where(valid_mask)[0]
    
    for idx in valid_indices:
        # 字节偏移 = 整数索引 * 4
        byte_offset = idx * 4
        print(f"Found valid sequence at byte offset {byte_offset}: {a1D[idx:idx+target_length]}")
else:
    print("Firmware data is shorter than target sequence length (16 integers)")

运行这段代码会输出:

Found valid sequence at byte offset 0: [ 1  2  3  4  6  5  7  8 10  9 11 13 12 14 15  0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:21:01