对python 自定义协议的方法详解


Posted in Python onFebruary 13, 2019

前面说到最近在写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 相关文章推荐
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Python实现二叉堆
Feb 03 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
python pytest进阶之fixture详解
Jun 27 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
Python序列类型的打包和解包实例
Dec 21 Python
基于h5py的使用及数据封装代码
Dec 26 Python
浅谈Python中的继承
Jun 19 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
详解Python中__new__方法的作用
Mar 31 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 #Python
Python魔法方法详解
Feb 13 #Python
Python函数中不定长参数的写法
Feb 13 #Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 #Python
python调用c++传递数组的实例
Feb 13 #Python
利用ctypes获取numpy数组的指针方法
Feb 12 #Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 #Python
You might like
php函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
php判断访问IP的方法
2015/06/19 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
在Python中使用Mako模版库的简单教程
2015/04/08 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
python机器学习库常用汇总
2017/11/15 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
django自定义模板标签过程解析
2019/12/14 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
法律专业推荐信范文
2013/11/29 职场文书
房屋转让协议书
2014/04/11 职场文书
小学语文课后反思精选
2014/04/25 职场文书
倡议书格式模板
2014/05/13 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
十八大标语口号
2014/10/09 职场文书
考试作弊检讨书
2015/01/27 职场文书
三八妇女节寄语
2015/02/27 职场文书
学习委员竞选稿
2015/11/20 职场文书
九年级历史教学反思
2016/02/19 职场文书