当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

Construct

二进制数据解析器和构建器
授权协议 MIT
开发语言 Python
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 不详
投 递 者 廖夜洛
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Construct是一款声明式的二进制数据解析器和构建器。

简而言之,它是对标准模块struct的封装和增强,适用于描述基于二进制数据通信协议的数据结构,可视为二进制数据的Python ORM库。

概述

您不必编写命令式代码来解析一段数据,而是以声明方式定义和描述二进制的数据结构。由于此数据结构不是代码,一方面您可以使用它来将数据解析成Pythonic对象,另一方面,您也可以将pythonict对象构建为二进制数据。

Construct库提供了简单的原子结构(例如各种大小的整数)以及复合的构造,适用于建立日益复杂的分层和顺序结构。Construct拥有基于特征位(bit)和字节(byte)粒度的构建,易于调试和测试,易于扩展的子类系统,以及大量原始构造,使您的工作更轻松:

字段(Field):原始字节或数字类型
结构和序列(Structs and Sequences):将更简单的结构组合到更复杂的结构中
按位(Bitwise):将字节分割为位粒度字段
适配器(Adapter):更改数据的显示方式
数组/范围(Arrays/Ranges):重复构造
元结构(Metaclass):使用上下文(历史)来计算数据的大小
条件(If / Switch):根据上下文分支计算路径
按需(懒惰)解析(Lazy ):只读和解析你需要的东西
指针(Pointers):从这里跳到数据流中

基础用法

Struct例子,与python字典的相对应,Container类类似于字典。

>>> format = Struct(
...     "signature" / Const(b"BMP"),
...     "width" / Int8ub,
...     "height" / Int8ub,
...     "pixels" / Array(this.width * this.height, Byte),
... )
>>> format.build(dict(width=3,height=2,pixels=[7,8,9,11,12,13]))
b'BMP\x03\x02\x07\x08\t\x0b\x0c\r'
>>> format.parse(b'BMP\x03\x02\x07\x08\t\x0b\x0c\r')
Container(signature=b'BMP')(width=3)(height=2)(pixels=[7, 8, 9, 11, 12, 13])

Repeaters例子,与列表相对应,每个元素类型都相同。具体还分为Arrays,Ranges,GreedyRange 和 RepeatUntil 四种子类型。以下是Arrays的例子

>>> Byte[10].parse(b"1234567890")
[49, 50, 51, 52, 53, 54, 55, 56, 57, 48]
>>> Byte[10].build([1,2,3,4,5,6,7,8,9,0])
b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x00'

Sequence例子,与列表相对应,每个元素可以是任意原子或者组合的数据。

>>> format = PascalString(Byte, encoding="utf8") >> GreedyRange(Byte)
>>> format.build([u"lalalaland", [255,1,2]])
b'\nlalalaland\xff\x01\x02'
>>> format.parse(b"\x004361789432197")
['', [52, 51, 54, 49, 55, 56, 57, 52, 51, 50, 49, 57, 55]]

高级用法

4字节存储一个IPv4地址,利用Adapter定义如下:

>>> class IpAddressAdapter(Adapter):
...     def _encode(self, obj, context):
...         return list(map(int, obj.split(".")))
...     def _decode(self, obj, context):
...         return "{0}.{1}.{2}.{3}".format(*obj)
...
>>> IpAddress = IpAddressAdapter(Byte[4])

解析和构建用法如下:

>>> IpAddress.parse(b"\x01\x02\x03\x04")
'1.2.3.4'
>>> IpAddress.build("192.168.2.3")
b'\xc0\xa8\x02\x03'
  • 1、_initialize()方法是在任何方法执行之前,都要执行的,当然也包括_ _构造构造函数。也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initialize()函数的自动调用,  而_construct构造函数仅仅在创建对象的时候调用一次,跟其它方法调用没有关系。 2、_ _construct这里是双划线,而_initialize()函数是单划线 3、如果父子

  • time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are three sticks with integer lengths l1,l2l1,l2 and l3l3. You are asked to break ex

  • 一、Construction代表类中的一个构造方法,这个类封装了类的定义。 其中包括了访问修饰符,方法名,参数列表。 二、Constructor的常用方法 1.String getName();获得方法名。 2.int getModifiers();获得修饰符。 3.Class[] getParamenterTypes();获得构造方法的参数类型。 4.newInstance(Object...a

  • time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given three positive integers nn, aa and bb. You have to construct a string ss of

  • constructor 是一种用于创建和初始化class创建的对象的特殊方法。 在一个类中只能有一个名为 “constructor” 的特殊方法。 一个类中出现多次构造函数 (constructor)方法将会抛出一个 SyntaxError 错误。 在一个构造方法中可以使用super关键字来调用一个父类的构造方法。 如果没有显式指定构造方法,则会添加默认的 constructor 方法。 如果不指

  • 原型链 所有对象都有自己的原型对象(prototype)。一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所有它也有自己的原型。因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型...... 一层层追溯的话,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性。也就是说

  • STL定义了五个全局函数,作用于未初始化的空间上。 其中两个全局函数construct()和destroy()负责对象的构造和析构,它们隶属于STL标准规范。 构造对象直接使用定位new: template <class T1, class T2> inline void construct(T1* p, const T2& value) { new (p) T1(value); //

  •   这节课我们来讲Constructor类,这个类表示构造器,直接看代码   package reflection; import helloworld.MyArrayList; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public cla

  • __construct()是php内置的构造函数,__initialize()是php框架中定义的(如thinkphp),用法基本一致。 区别: 子类的__initialize方法自动调用父类的__initialize方法。(thinkphp) 更正:在tp中若父类和子类都有_initialize,则只调用子类的_initialize,并不会自动调用父类_initialize 而子类的__cons

  • https://www.cnblogs.com/guxuanqing/p/11396511.html C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace。 比如如果你想要向 std::vector 的末尾添加一个数据,你可以: std::vector nums; nums.push_back(1)

  • ThinkPHP中的__initialize()和类的构造函数__construct() 网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下。将结果和大家分享。不对请更正。 首先,我要说的是 1、__initialize()不是php类中的函数,php类的构造函数只有__construct(). 2、类的初始化:子类如果有自己的构造函数(__construct

  • __construct()是php内置的构造函数,__initialize()是php框架中定义的(如thinkphp),用法基本一致。 区别: 在tp中若父类和子类都有_initialize,则只调用子类的_initialize,并不会自动调用父类_initialize 而子类的__construct方法如果要调用父类的__construct方法,必须在子类构造函数显示调用parent::__c

  • /** * 清晰的认识__construct() __destruct */ class Example { public static $link; //在类实例化的时候自动加载__construct这个方法 public function __construct($localhost, $username, $password, $db) { s

  • 大卫注: 今天整理Computer上的旧资料,偶然发现了两篇不知什么时候从网上下来的文章,谈的是关于对象construct与destruct的问题,感觉作者讲的不是太清楚,按其思想进行改写后发布于此. 对象的construct与destruct是C++中一个最基本的概念,虽然简单,但其中有些特性也值得我们去关注,以便更好地加以利用,写出有效而且高效的代码. 先看一个程序,程序很简单,只是添加了一些

  • 其实这个问法是有问题的,__construct 与 __destruct 没什么可比性,两个方法一个在对象被创建的时候触发,另一个在对象被销毁的时候触发 具体可以翻阅PHP官方手册中的 http://php.net/manual/zh/language.oop5.decon.php 构造方法和析构方法条目来了解细节 转载于:https://www.cnblogs.com/toumingbai/p/

  • 问题记录: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversio

  • SpringBoot 提示:Cannot construct instance of  com.digipower.sercurity.entity.JwtUserDetails (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-b

  • constructor() 方法是类的构造函数(默认方法); 用于传递参数,返回实例对象,通过 new 命令生成对象实例时 ,自动调用该方法。 如果没有显示定义, 类内部会自动给我们创建一个constructor()。 class Person { constructor(name,age) { // constructor 构造方法或者构造函数 this.name = name; this

  • constructor 属性返回所有 JavaScript 变量的构造函数。 实例: "John".constructor // 返回函数 String() { [native code] } (3.14).constructor // 返回函数 Number() { [native code] } false.construct

  • __construct()是php内置的构造函数 注意事项: 若父类和子类 都有 __construct,则只调用子类的__construct,不会自动调用父类的__construct 子类的__construct方法如果要调用父类的__construct方法,必须在子类构造函数中调用父类的构造函数 parent::__construct(); // 子类中调用父类的构造函数

  • constructor在一个对象被new时执行 构造函数可以省略,省略构造函数则new对象实例时,所有的数据类型赋值为0,bool类型赋值为FALSE,引用类型赋值为NULL。 构造函数必须与类同名,而且不能有返回类型。而方法是可以与类同名的,但是必须声明返回数据类型。 当new对象是首先调用静态初始数据块(可省略),然后调用父类构造函数(不是子类则不调用),最后调用自己的构造函数(一定调用),这

  • 错误描述: 序列化错误  com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.zookeeper.dubbo.register.consumer.domain.Zkuser` (no Creators, like default construct, exi

 相关资料
  • 简易 XML 操作 通过本文,您将了解使用 Groovy 分解 XML 是多么地容易。在本期的 实战 Groovy 中,作者 Scott Davis 演示了无论您是使用 MarkupBuilder 和 StreamingMarkupBuilder 创建 XML,还是使用 XmlParser 和 XmlSlurper 解析 XML,Groovy 都提供了一系列用于处理这类流行数据格式的工具。 XML

  • 主要内容:实例对象可以使用输入和输出流来提供参数数据。能够将整个文件放入可以容纳大值的数据库列,例如和数据类型。 有以下方法可用于流式传输数据 - :此方法用于提供大的ASCII值。 :此方法用于提供较大的UNICODE值。 :此方法用于提供较大的二进制值。 方法除了参数占位符之外还需要额外的参数和文件大小。此参数通知驱动程序使用流向数据库发送多少数据。 实例 考虑要将XML文件上传到数据库表中。下面是XML文

  • 主要内容:二进制数、八进制数和十六进制数的表示,二进制数、八进制数和十六进制数的输出C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。 二进制数、八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。 1) 二进制 二进制由 0 和 1 两个数字组成,使用时必须以

  • 问题内容: 我正在编写一些代码来与Redmine交互,并且作为过程的一部分,我需要上传一些文件,但是我不确定如何从包含二进制文件的python发出POST请求。 我正在尝试模仿这里的命令: 在python中(如下),但它似乎不起作用。我不确定问题是否与编码文件有关,或者标题是否有问题。 我可以访问服务器,它看起来像是编码错误: 问题答案: 基本上您所做的是正确的。查看链接到的redmine文档,U

  • 我正在编写一些与redmine接口的代码,并且我需要上传一些文件作为过程的一部分,但是我不确定如何从包含二进制文件的python发出POST请求。 我尝试在这里模拟命令: 在python中(如下),但它似乎不起作用。我不确定这个问题是否与文件编码有关,或者标题是否有问题。 我可以访问服务器,它看起来像一个编码错误:

  • 问题内容: 我正在尝试将二进制数据发送到Express应用程序。只要我的值小于0x80,它就可以正常工作。如果单个值是0x80或更大,则会弄乱整个缓冲区。 快递处理程序: Python客户端(内容类型:应用程序/ x-www-form-urlencoded): 当数据= 1,2时表示输出。 这就是我所期望的 。 当数据= 1,0xFF时表示输出。有趣的是,9520实际上是十六进制的0x25 0x3

  • Blob对象 FileList对象 File对象 FileReader对象 综合实例:显示用户选取的本地图片 URL对象 参考链接 历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript 5引入

  • Blob对象 FileList对象 File对象 FileReader对象 综合实例:显示用户选取的本地图片 URL对象 参考链接 历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript 5引入