对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中函数的参数定义和可变参数用法实例分析
Jun 04 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
python保存文件方法小结
Jul 27 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
python实现人脸签到系统
Apr 13 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
python元组打包和解包过程详解
Aug 02 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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
jQuery代码优化 事件委托篇
2011/11/01 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
北大自主招生自荐信
2013/10/19 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
市场督导岗位职责
2015/04/10 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
刑事附带民事代理词
2015/05/25 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技
windows系统搭建WEB服务器详细教程
2022/08/05 Servers