def analyze_ntfs_data_attribute(data): """ 分析 NTFS 数据结构中的80属性($DATA),返回文件分片数量 参数: data (list): 包含字典的列表,每个字典需有'sequence'键 (示例结构见问题描述) 返回: int: 分片数量(常驻属性返回1,非常驻属性返回数据运行的分片数) 异常: ValueError: 当输入数据无效时抛出 """ # 第一步:提取并转换sequence数据 hex_bytes = [] for entry in data: if 'sequence' in entry: for hex_str in entry['sequence']: hex_bytes.extend(hex_str.split()) print(hex_bytes) # 将十六进制字符串转换为整数列表 try: attribute_data = [int(x, 16) for x in hex_bytes] except ValueError: raise ValueError("无效的十六进制数据") # 第二步:分析属性结构 if len(attribute_data) < 24: raise ValueError("属性数据过短,无法解析头部信息") # 检查属性类型(0x80) if attribute_data[0] != 0x80: raise ValueError("不是80属性($DATA属性)") # 检查是否常驻(偏移0x08) is_resident = attribute_data[8] == 0 if is_resident: return 1 else: # 解析非常驻属性的数据运行列表 data_run_offset = attribute_data[0x20] | (attribute_data[0x21] << 8) if data_run_offset >= len(attribute_data): raise ValueError("数据运行偏移超出属性长度") data_runs = attribute_data[data_run_offset:] fragment_count = 0 pos = 0 while pos < len(data_runs): header_byte = data_runs[pos] if header_byte == 0x00: break len_len = (header_byte >> 4) & 0x0F offset_len = header_byte & 0x0F if len_len == 0 or offset_len == 0: break pos += 1 + len_len + offset_len fragment_count += 1 return fragment_count input_data = [ { 'start_byte': 3221267456, 'offset': 264, 'sequence': [ '80 00 00 00 48 00 00 00', '01 00 00 00 00 00 01 00', '00 00 00 00 00 00 00 00', '79 00 00 00 00 00 00 00', '40 00 00 00 00 00 00 00', '00 a0 07 00 00 00 00 00', '0b 93 07 00 00 00 00 00', '0b 93 07 00 00 00 00 00', '31 7a 00 ee 0b 00 00 00' ], 'is_resident': False, 'total_groups': 9, 'attribute_length': 72 } ] print(analyze_ntfs_data_attribute(input_data)) # 输出分片数量