python 自定义协议

前面说到最近在写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 的 structbytearray 的操作真是舒服,直接放进去就可以了(之前我有不少东西都是徒手解的,回头再用这个优化下自己的代码吧。)
另外一个是vi写代码真是直接方便

要说缺点的话,应该是用私有协议,没有第三方工具可以作为公证,例如postman之类的。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值