def read_binary_file(filename): header_regex = re.compile(r'(\w+)\s*=\s*(.*?)(?=;|\})', re.DOTALL) header = {} with open(filename, 'rb') as f: line = f.readline().decode().strip() version_info = line.split('=')[1].strip() for match in header_regex.finditer(f.read().decode()): header[match.group(1)] = match.group(2).strip() # Read data blocks while True: try: start_address, block_size, data = read_data_block(f) print(f"Data block at 0x{start_address:X}, size {block_size}, offset {f.tell() - block_size - 10}") except struct.error: break return version_info, header 这个函数 要将数据块的信息也作为输出
时间: 2024-03-03 10:52:59 浏览: 57
可以将每个数据块的信息存储到一个列表中,然后将该列表作为函数的输出。具体实现方法如下:
1. 在函数开始时,定义一个空列表 `data_blocks`,用于存储每个数据块的信息。
2. 在读取完文件头后,进入一个循环,每次读取一个数据块并将其信息存储到 `data_blocks` 中。
3. 如果读取数据块时发生了 `struct.error`,说明已经读取完了所有数据块,跳出循环。
4. 在函数末尾,将 `version_info` 和 `header` 以及 `data_blocks` 一起作为函数的输出返回。
下面是修改后的代码:
```
def read_binary_file(filename):
header_regex = re.compile(r'(\w+)\s*=\s*(.*?)(?=;|\})', re.DOTALL)
header = {}
data_blocks = []
with open(filename, 'rb') as f:
line = f.readline().decode().strip()
version_info = line.split('=')[1].strip()
for match in header_regex.finditer(f.read().decode()):
header[match.group(1)] = match.group(2).strip()
while True:
try:
start_address, block_size, data = read_data_block(f)
data_blocks.append((start_address, block_size, f.tell() - block_size - 10))
except struct.error:
break
return version_info, header, data_blocks
```
其中,`data_blocks` 中每个元素都是一个元组,包含三个值:
- `start_address`:数据块的起始地址;
- `block_size`:数据块的大小;
- `f.tell() - block_size - 10`:数据块在文件中的偏移量,即该数据块之前的所有数据的大小(包括文件头)加上 10(文件头的大小)。
阅读全文