python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真

本文介绍了一种名为TLV(类型-长度-值)的数据结构,并提供了使用Python实现的TLV结构的构建与解析方法。该实现包括了错误处理机制,支持扩展位设置,并通过一个示例程序展示了如何构建TLV数据包及解析这些数据包。

from scapy.all import *

classTLVError(Exception):pass

classTLV:def __init__(self, tl_in_l=False, t_ext=0, l_ext=0):

self.buffer= ""self.tl_in_l=tl_in_l

self.t_ext=t_ext

self.l_ext=l_extdef_int(self, i, ext):

maxi= 1<<8

if ext >0:

maxi= (1 <

holdstr= ""holder=i

extend=0

count= 1

while holder >=maxi:

count+= 1newnum= (holder & (maxi - 1))

holdstr= chr(newnum | extend) +holdstr

extend=maxi

holder/=maxi

holdstr= chr(holder | extend) +holdstrreturnholdstrdef_t(self, t):if self.t_ext == 0 and t > 256:raise TLVError("type > 256 and no extension bit set")returnself._int(t, self.t_ext)def_l(self, l):if self.l_ext == 0 and l > 256:raise TLVError("length > 256 and no extension bit set")returnself._int(l, self.l_ext)def add(self, t, v, l=None):

self.buffer+=self._t(t)

length= 0 if l is None elselifself.tl_in_l:

length+=tif l isNone:

length+=len(v)

self.buffer+=self._l(length)

self.buffer+=vdef __str__(self):returnself.bufferdef __repr__(self):returnself.bufferclassTLVParser:def __init__(self, buffer, tl_in_l=False, t_ext=0, l_ext=0):

self.buffer=buffer

self.tl_in_l=tl_in_l

self.t_ext=t_ext

self.l_ext=l_ext

self.offset=0def_get_i(self, i_ext):try:

byte=ord(self.buffer[self.offset])exceptIndexError:raise TLVError("Not enough data")

ext= 1 << (i_ext if i_ext > 0 else 8)

i=0while byte &ext:

i+= (byte & (ext - 1))

i<<=i_ext

self.offset+= 1

try:

byte=ord(self.buffer[self.offset])exceptIndexError:raise TLVError("Not enough data")

i+=byte

self.offset+= 1

returnidef_get_tlv(self):

t=self._get_i(self.t_ext)

l=self._get_i(self.l_ext)if self.offset + l >len(self.buffer):raise TLVError("Buffer not long enough to encompass TLV")

v= self.buffer[self.offset:self.offset+l]

self.offset+=lreturn(t, l, v)defparse(self):while self.offset

t, l, v=self._get_tlv()yield{"type": t,"length": l,"value": v,

}#Test/example program for building TLVs and parsing the TLVs

if __name__ == "__main__":

tlv= TLV(t_ext=7, l_ext=7)

tlv.add(10, "Foobar")

tlv.add(16, "Bladibla")#hexdump(tlv)

tlvp = TLVParser(tlv.buffer, t_ext=7, l_ext=7)for avp intlvp.parse():print ("%d(%d): %s" % (avp["type"], avp["length"], avp["value"]))

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值