来源:互联网 更新时间:2026-06-08 07:51
用 struct 模块按自定义协议打包解包 TCP 报文,这种需求在实际开发中非常常见——比如你需要在 Python 中快速构造并解析一个带魔数、长度、类型和变长数据体的二进制载荷。协议格式并不复杂:4 字节魔数(大端)、2 字节长度(大端)、1 字节类型,后面跟着长度字段指定的数据体。关键是要把边界检查做到位,否则一旦接收方拿到一个损坏的字节流,轻则解析错误,重则内存越界。

先明确协议规范:魔数固定为 0x12345678(大端),长度字段是紧随其后的 2 字节无符号整数(网络字节序),类型占 1 字节,数据体长度由长度字段精确指定——注意这个长度不包含头部本身。这一步必须严格对齐,否则后续封包解包必然错位。
用 Python struct 模块打包时,格式字符串必须写成 !IHB:其中
i / h 会导致本地字节序污染,跨平台收发时直接解析失败——这一点在调试时很容易踩坑。
创建函数 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(data: bytes) -> tuple[int, bytes] | None,返回类型和数据体,失败返回 None。先检查输入长度是否 ≥ 7 字节(4+2+1 最小头长),不足则直接返回 None;再用 struct.unpack_from("!IHB", data) 解出魔数、长度、类型;验证魔数是否等于
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 就表示封包解包逻辑完全可靠——你可以把这个脚本作为项目里的基础工具函数。
《Off Campus》第二季官宣:这对CP还在,但不再是主角
和平精英如何做到压枪稳-和平精英怎样才能压枪稳
客单价碾压宝马奥迪!极氪5月交付新车34377辆:连续4个月双增长
免费影视剧APP推荐
HBO 奇幻剧《龙之家族》第三季定档 6 月 22 日,最终预告片曝光喉道海战
儿子穿新中式现身大会堂 马斯克罕见用中文回应:他正在学习普通话
DOTA2 TI时隔七年重返上海!门票6月10日开抢,国服享受优先购买!
抖音最火沙雕男生网名(精选100个)
网络热词聊污是什么意思
帅气继父网名女生可爱英文(精选100个)
金铲铲之战s17六暗星卡莎阵容玩法构筑指南
我的末日校园海斗手游上线时间是哪天
蒙古上单是什么梗
SpaceX狂揽AI人才,马斯克亲自面试且不看简历背景
免费看片软件下载地址推荐
阿里发布Qwen3.7-Max大模型,全球第五、国产第一
免费看电影的软件推荐
韦一敏是什么梗
三角洲行动卡战备怎么弄 三角洲行动卡战备攻略
晨字沙雕网名大全女生(精选100个)
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc