读取二进制固件寻找小端序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方案的问题排查与修正
问题原因
- 切片为空:你的测试数组
a1D长度为16,使用np.convolve(..., mode='same')得到的结果长度同样为16。后续[8:-8]切片等价于从索引8到索引8(因为负数索引-8对应正向索引16-8=8),最终得到空数组,因此np.where返回空结果。 - 卷积逻辑不合理:通过求和判断的方式不准确,即使和小于
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
相关产品推荐
相关产品推荐

