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

时间:2021-05-22

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

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

简单放一下他的实现:

import structimport ctypesclass E(Exception): def __init__(self, what): self.what = what def __str__(self): return self.whatdef 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 = 0ss = 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 += 12struct.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 + 16unmarshall_packet(ss[:offset])"""hex=""ss = bytearray.fromhex(hex)unmarshall_packet(ss)

有很多可以学习的地方

一个是python 的 struct 对 bytearray 的操作真是舒服,直接放进去就可以了(之前我有不少东西都是徒手解的,回头再用这个优化下自己的代码吧。)

另外一个是vi写代码真是直接方便

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

以上这篇对python 自定义协议的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章