55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
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 |