模拟计数
模拟pattern里的攻击者地址的WL计数器,A_list
Act命令来时:
[Act,addr,cnt]
在A_list里找addr(一定能找到,因为就是这么设置的),并把来的命令里的cnt加到A_list对应的地址的cnt上。
得到加了cnt之后的addr和新cnt。
把[Act,addr,新cnt]给LUT表,按照LUT表Act进行正常处理。
RHR命令来时:
把RHR命令给LUT表,按照LUT表RHR进行正常处理,它输出的地址就是要刷的地址。
把这个要刷的地址的在A_list中的cnt值清零。
class AddressTable:
def __init__(self, n):
# 初始化时直接将 count 设为浮点数 0.0
self.rows = [{'address': f'A{i+1}', 'count': 0.0} for i in range(n)]
self.address_map = {row['address']: row for row in self.rows}
def process_command(self, command):
cmd = command[0]
if cmd == 'Act':
addr = command[1]
cnt = command[2]
if addr not in self.address_map:
raise ValueError(f"Address {addr} not found")
if not isinstance(cnt, (int, float)):
raise ValueError("cnt值必须是整数或浮点数")
row = self.address_map[addr]
row['count'] += float(cnt) # 显式转换为浮点数
return ['Act', addr, row['count']]
elif cmd == 'RHR':
addr = command[1]
if addr not in self.address_map:
raise ValueError(f"Address {addr} not found")
row = self.address_map[addr]
row['count'] = 0.0 # 重置为浮点数 0.0
return ['RHR', addr, 0.0]
elif cmd == 'EXP':
if len(command) != 1:
raise ValueError("EXP命令格式应为 ['EXP']")
export_data = [[row['address'], row['count']] for row in self.rows]
return ['EXP', export_data]
else:
raise ValueError("无效命令")
下面试一下
# 初始化一个包含3行的表 table = AddressTable(3) # 导出初始状态 print(table.process_command(['EXP'])) # 输出: ['EXP', [['A1', 0], ['A2', 0], ['A3', 0]]] # 执行Act命令并再次导出 table.process_command(['Act', 'A2', 5]) print(table.process_command(['EXP'])) # 输出: ['EXP', [['A1', 0], ['A2', 5], ['A3', 0]]] table.process_command(['Act', 'A3', 8]) print(table.process_command(['EXP'])) # 执行RHR命令后导出 table.process_command(['RHR', 'A2']) print(table.process_command(['EXP'])) # 输出: ['EXP', [['A1', 0], ['A2', 0], ['A3', 0]]]
浙公网安备 33010602011771号