当前位置:脚本大全 > > 正文

python开源协议简介(对python 自定义协议的方法详解)

时间:2022-03-31 12:06:30类别:脚本大全

python开源协议简介

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

前面说到最近在写python的一些东西,然后和另外一位小伙伴定义了协议,然后昨天我有一部分东西没理解对,昨天上午我自己重写了一遍接收和发送的全部逻辑,昨天下午补了压力测试的脚本,自测没问题之后告知联调的小伙伴。

结果上午还是出了一点问题,然后我们两对代码,他写了一个python的实现。还好最后我这边没问题。(我也害怕是我这边出问题啊,所以我自己的代码都自己检查了好几遍)

简单放一下他的实现:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 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 自定义协议的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。

    原文链接:https://blog.csdn.net/yeshennet/article/details/77238393

    上一篇下一篇

    猜您喜欢

    热门推荐