Python自定义二进制协议实现与struct模块应用解析

Leo
Leo
发布时间:2026-10-13| 6人浏览过
原创

本文分享了基于Python实现自定义二进制协议的实践过程,重点解析了利用struct模块高效处理bytearray数据的方法。通过对比手动解析与自动化解包,展示了如何优化接收发送逻辑,并探讨了私有协议在缺乏Postman等第三方调试工具时的实现细节与潜在局限。

此前在开发Python相关功能时,我与另一位开发者共同定义了通信协议。昨天我发现自己对部分逻辑的理解存在偏差,因此上午重新编写了完整的接收与发送逻辑,下午补充了压力测试脚本。在完成自测确认无误后,我通知了负责联调的同事。

然而上午联调时仍出现了一些异常,随后我们双方进行了代码比对,他提供了一份Python实现版本。最终确认问题不在我这边(我也担心是自己出错,因此对自己的代码进行了多次检查)。

此处简要展示对方的实现代码:

import struct
import ctypes

class E(Exception):
 def __init__(self, what):
  self.what = what

 def __str__(self):
  return self.what

def unmarshall_packet(pk):
 if len(pk) < 12:
  raise E("Invalid pk header")
 size, uri, prop_count = struct.unpack("<III", pk[:12]);
 print "size:%d uri:%d prop_count:%d" % (size, uri, prop_count)
 if len(pk) - 12 != size - 8:
  raise E("Invalid pk length")

 ss = pk[12:]
 offset = 0
 for x in range(0, prop_count):
  # Pop key
  key_size, = struct.unpack_from("<I", ss, offset)
  print "key_size:%d" % (key_size,)
  offset += 4
  key, = struct.unpack_from("<%ds" % (key_size - 1,), ss, offset)
  offset += key_size

  # Pop value 
  val_size, = struct.unpack_from("<I", ss, offset)
  offset += 4
  print "val_size:%d" % (val_size,)
  val, = struct.unpack_from("<%ds" % (val_size - 1,), ss, offset)
  offset += val_size


  print "key:%s val:%s" % (key, val)


key1 = "key1"
val1 = "val1"
key2 = "key2"
val2 = "val2"
offset = 0
ss = ctypes.create_string_buffer(9085)
struct.pack_into("<III", ss, 0, 8 + 4 + len(key1) + len(val1) + len(key2) + len(val2) + 16, 2, 2)
offset += 12
struct.pack_into("<I%dscI%dscI%dscI%dsc" % (len(key1), len(val1), len(key2), len(val2)), ss, offset, len(key1) + 1, key1, '\0', 
 len(val1) + 1, val1, '\0',
 len(key2) + 1, key2, '\0', 
 len(val2) + 1, val2, '\0')
offset += len(key1) + len(val1) + len(key2) + len(val2) + 4 + 16
unmarshall_packet(ss[:offset])

"""
hex=""
ss = bytearray.fromhex(hex)
unmarshall_packet(ss)

该实现中有许多值得借鉴的地方。

首先是Python的struct模块对bytearray的操作非常便捷,数据可以直接放入进行解包(此前我部分逻辑采用手动解析,后续计划利用此方法优化代码)。

其次,使用vi编辑器编写此类代码直接且高效。

若论缺点,采用私有协议意味着缺乏如Postman等第三方通用工具进行公证或调试。

以上关于Python自定义协议方法的详解内容分享完毕,希望能为读者提供参考,也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。