from struct import unpack import time def parse_data(data, structure): """解析结构化数据""" result = {"raw_data": list(data)} if not structure: return result result["parsed"] = {} for field in structure: offset = field["offset"] name = field["name"] data_type = field["type"] try: if data_type == "int": if offset + 2 > len(data): raise ValueError("Offset out of bounds") val = unpack(">h", data[offset:offset+2])[0] elif data_type == "dint": if offset + 4 > len(data): raise ValueError("Offset out of bounds") val = unpack(">l", data[offset:offset+4])[0] elif data_type == "real": if offset + 4 > len(data): raise ValueError("Offset out of bounds") val = unpack(">f", data[offset:offset+4])[0] elif data_type == "bool": bit = field.get("bit", 0) if offset >= len(data): raise ValueError("Offset out of bounds") byte = data[offset] val = bool((byte >> bit) & 1) elif data_type == "byte": if offset >= len(data): raise ValueError("Offset out of bounds") val = data[offset] elif data_type == "word": if offset + 2 > len(data): raise ValueError("Offset out of bounds") val = (data[offset] << 8) | data[offset + 1] elif data_type == "dword": if offset + 4 > len(data): raise ValueError("Offset out of bounds") val = (data[offset] << 24) | (data[offset+1] << 16) | (data[offset+2] << 8) | data[offset+3] else: val = f"Unknown type: {data_type}" result["parsed"][name] = val except Exception as e: result["parsed"][name] = f"Error: {str(e)}" return result