使用struct模块按!ihb格式打包解包tcp报文:魔数0x12345678(大端)、2字节长度、1字节类型,数据体长度由长度字段指定;pack_message封装头部与载荷,unpack_message校验魔数、长度并安全切片,含完整边界检查。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要在Python中快速构造并解析符合自定义结构的TCP载荷,比如含4字节魔数、2字节长度、1字节类型、变长数据体的二进制报文,且要求代码可直接运行、带完整边界校验和字节序控制。
定义报文结构与字段约束
先明确协议规范:魔数固定为0x12345678(大端),长度字段为紧随其后的2字节无符号整数(网络字节序),类型占1字节,数据体长度由长度字段精确指定,不包含头部本身。这一步必须严格对齐,否则后续封包解包必然错位。
用Python struct 模块打包时,格式字符串必须写成 !IHB:其中 【! 表示大端+网络字节序,I 是4字节魔数,H 是2字节长度,B 是1字节类型】。漏掉叹号或用小写i/h会导致本地字节序污染,跨平台收发时直接解析失败。
编写封包函数(pack_message)
创建函数 pack_message(msg_type: int, payload: bytes) -> bytes:
第一步:计算总载荷长度 = len(payload);第二步:用 struct.pack("!IHB", 0x12345678, len(payload), msg_type) 打包头部;第三步:拼接头部 + payload 返回完整二进制串。
注意:msg_type 必须在 0–255 范围内,超出会触发 struct.error;payload 为空字节串(b"")是合法的,此时长度字段为 0。
编写解包函数(unpack_message)
函数签名:unpack_message(data: bytes) -> tuple[int, bytes] | None,返回类型和数据体,失败返回 None。
先检查输入长度是否 ≥ 7 字节(4+2+1 最小头长),不足则直接返回 None;再用 struct.unpack_from("!IHB", data) 解出魔数、长度、类型;验证魔数是否等于 【0x12345678】,不等即丢弃;接着检查剩余长度是否足够容纳声明的数据体——即 len(data) >= 7 + declared_length,否则截断风险极高;最后切片取出 payload 并返回 (msg_type, payload)。
生成带测试用例的完整可执行脚本
在 VS Code 中新建 tcp_packet.py,粘贴以下内容:
① 导入 struct;② 定义 pack_message 和 unpack_message 函数;③ 写三组测试:正常封包→解包→比对;超长 payload 封包→解包→验证长度;错误魔数数据→解包→返回 None;④ 每个测试后加 print("PASS") 或 print("FAIL")。
保存后,在终端执行 python tcp_packet.py,看到三行 PASS 即表示封包解包逻辑完全可靠。









