namedstruct 二进制结构体解析库开源项目

我要开发同款
匿名用户2017年01月24日
94阅读

技术信息

开源地址
https://github.com/sing1ee/simhash-java
授权协议
Apache

作品详情

amedstruct是一个解析二进制结构体的专用库,它不仅可以解析简单的C结构体,还可以支持变长结构体、可扩展的结构体之类复杂的情况。它被用来在VLCP中解析OpeFlow(SDN专用的二进制协议)。

使用这个库,你会发现,即便是像OpeFlow这样复杂的协议,实际上只需要将对应的C程序的头文件(比如opeflow.h)按照相应的规则进行修改,添加一些简单的参数说明结构体之间的关系,就可以用一行代码将它完整解析出来,或者用一行代码生成出相应的结构体。

可以使用pip安装:

pip istall struct示例###### BASIC STRUCT #####from amedstruct import *mytype = struct((uit16, 'myshort'),  # usiged short it                (uit8, 'mybyte'),       # usiged char                (uit8,),               # a paddig byte of usiged char                (char[5], 'mystr'),   # a 16-byte bytes strig                (uit8,),                (uit16[5], 'myarray'),    #                 ame = 'mytype',                paddig = 1)# Create a objectobj0 = mytype()# Access a fields = obj0.myshortobj0.myshort = 12# Create a object with the specified fields iitializedobj1 = mytype(myshort = 2, mystr = b'123', myarray = [1,2,3,4,5]) # Upack a object from stream, retur the object ad bytes size usedobj2,size = mytype.parse(b'\x00\x02\x01\x00123\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05')# Upack a object from packed bytesobj3 = mytype.create(b'\x00\x02\x01\x00123\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05')# Estimate the struct sizesize = le(obj0)# Estimate the struct size excludes automatic paddig bytessize2 = obj0._realsize()# Pack the objectb = obj0._tobytes()b2 = mytype.tobytes(obj0)# Use the type i other structsmytype2 = struct((mytype, 'mydata'),                (mytype[4], 'mystructarray'),                ame = 'mytype2',                paddig = 1)obj4 = mytype2()obj4.mydata.myshort = 12obj4.mystructarray[0].mybyte = 7b3 = obj4._tobytes()###### VARIABLE LENGTH TYPES #####my_usize_struct = struct((uit16, 'legth'),                        (raw, 'data'),                        paddig = 1,                        ame = 'my_usize_struct')""">>> my_usize_struct.create(b'\x00\x07abcde').datab'abcde'>>> my_usize_struct.parse(b'\x00\x07abcde')[0].datab''"""my_size_struct = struct((uit16, 'legth'),                        (raw, 'data'),                        paddig = 1,                        ame = 'my_size_struct',                        prepack = packrealsize('legth'),                        size = lambda x: x.legth)"""packrealsize('legth') is equivalet to:    def _packsize(x):        x.legth = x._realsize()"""""">>> my_usize_struct(data = b'abcde')._tobytes()b'\x00\x07abcde'>>> my_usize_struct.parse(b'\x00\x07abcde')[0].datab'abcde'"""##### EXTENDING #####my_base = struct((uit16, 'legth'),                 (uit8, 'type'),                 (uit8, 'basedata'),                 ame = 'my_base',                 size = lambda x: x.legth,                 prepack = packrealsize('legth'),                 paddig = 4)my_child1 = struct((uit16, 'data1'),                    (uit8, 'data2'),                    ame = 'my_child1',                    base = my_base,                    criteria = lambda x: x.type == 1,                    iit = packvalue(1, 'type'))my_child2 = struct((uit32, 'data3'),                   ame = 'my_child2',                   base = my_base,                   criteria = lambda x: x.type == 2,                   iit = packvalue(2, 'type'))"""Fields ad most base class optios are iherited, e.g. size, prepack, paddig>>> my_child1(basedata = 1, data1 = 2, data2 = 3)._tobytes()b'\x00\x07\x01\x01\x00\x02\x03\x00'>>> my_child2(basedata = 1, data3 = 4)._tobytes()b'\x00\x08\x02\x01\x00\x00\x00\x04'"""# Fields i child classes are automatically parsed whe the type is determiedobj1, _ = my_base.parse(b'\x00\x07\x01\x01\x00\x02\x03\x00')""">>> obj1.basedata1>>> obj1.data12>>> obj1.data23>>> obj1._gettype()my_child1"""# Base type ca be used i fields or arrays of other structsmy_base_array = struct((uit16, 'total_le'),                       (my_base[0], 'array'),                       ame = 'my_base_array',                       paddig = 1,                       size = lambda x: x.total_le,                       prepack = packrealsize('total_le'))obj2 = my_base_array()obj2.array.apped(my_child1(data1 = 1, data2 = 2, basedata = 3))obj2.array.apped(my_child2(data3 = 4, basedata = 5))""">>> obj2._tobytes()b'\x00\x12\x00\x07\x01\x03\x00\x01\x02\x00\x00\x08\x02\x05\x00\x00\x00\x04'"""obj3, _ = my_base_array.parse(b'\x00\x12\x00\x07\x01\x03\x00\x01\x02\x00\x00\x08\x02\x05\x00\x00\x00\x04')""">>> obj3.array[0].data22"""

 

功能介绍

namedstruct 是一个解析二进制结构体的专用库,它不仅可以解析简单的 C 结构体,还可以支持变长结构体、可扩展的结构体之类复杂的情况。它被用来在 VLCP 中解析 OpenFlow(SD...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论