对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查看目录中的文件示例详解
Aug 28 Python
python 从csv读数据到mysql的实例
Jun 21 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
Python Series从0开始索引的方法
Nov 06 Python
python虚拟环境迁移方法
Jan 03 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
使用Python函数进行模块化的实现
Nov 15 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
Nov 17 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 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 作用域解析运算符(::)
2010/07/27 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python 接口返回的json字符串实例
2018/03/27 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
基于python实现复制文件并重命名
2020/09/16 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
什么是serialVersionUID
2016/03/04 面试题
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
本科生详细的自我评价
2013/09/19 职场文书
优秀团员个人的自我评价
2013/10/02 职场文书
生日答谢词
2015/01/05 职场文书
客房服务员岗位职责
2015/02/09 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
电影复兴之路观后感
2015/06/02 职场文书
创业计划书之酒吧
2019/12/02 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js