*15.有如下数据通信协议,写一段程序,从一串数据中解析出数据帧。 (请充分考虑程序的健壮性) 1.帧头 2字节固定值0xAA 0xBB 2.数据长度 1字节 变长,取值范围2-10 3.数据 2-10字节有效数据 4.校验 1字节 数据长度和所有数据的异或值
时间: 2024-11-13 13:23:45 浏览: 4
要编写一个解析数据帧的程序,可以使用Python的结构化处理方式,这里提供一个简单的示例,它会检查输入数据是否符合规定的帧格式,并返回解析后的数据。考虑到健壮性,我们将添加错误处理。
```python
def parse_data_frame(data):
# 检查数据长度是否足够
if len(data) < 4:
raise ValueError("Invalid data length, minimum of 4 bytes required")
# 解析帧头
frame_head = data[:2]
if frame_head != b'\xAA\xBB':
raise ValueError("Invalid frame header, expected 0xAA 0xBB")
# 解析数据长度
data_length = int.from_bytes(data[2], byteorder='little')
if data_length < 2 or data_length > 10:
raise ValueError(f"Invalid data length: {data_length}")
# 计算校验值
checksum_start = 3 # 帧头+数据长度字段结束位置
checksum_data = data[checksum_start : checksum_start + data_length]
calculated_checksum = sum(checksum_data) ^ (data_length - 1)
# 获取实际校验值并比较
received_checksum = data[checksum_start + data_length]
if calculated_checksum != received_checksum:
raise ValueError("Checksum mismatch")
# 返回有效数据
return data[checksum_start + data_length + 1 : checksum_start + data_length + 1 + data_length]
# 示例数据
example_data = b'\xAA\xBB\x07HelloWorld!'
try:
parsed_data = parse_data_frame(example_data)
print(f"Parsed data: {parsed_data.decode('utf-8')}")
except ValueError as e:
print(e)
阅读全文