与二进制数据解析和转录相关的功能。
cs.binar的Python项目详细描述
与二进制数据解析和转录相关的功能。
注意:此模块需要Python3,建议使用Python3.6+ 因为它使用abc.abc,因为python 2 bytes对象也是 弱(只是一个str)还有我的cs.py3.bytes黑客类和 因为基于关键字的包初始化受益于 关键字参数排序。
在下面的描述中,我用"chunk"这个词来表示一个片段
遵循缓冲协议的二进制数据,几乎总是
字节
实例或内存视图,但原则上也是
例如bytearray
该模块中的类支持对二进制数据的简单解析 结构。
本模块中的函数和类包括:
packetfield
:二进制字段的抽象类,具有 工厂方法来解析它,一种转录方法来转录 它以二进制形式返回,通常是一个.value
属性 保持解析值。- 常见基本类型的几个假定子类
作为
uint32be
(无符号32位大端整数)。 结构字段
:为struct
使用单个值字段格式化。多结构字段
和结构元组
:制造工厂packetfield
s fromstruct
多值格式 领域;structuple
生成packetfields
这些字段也是namedtuple
s, 支持对解析值的简单访问。包
:用于分析多个将packetfields
放入一个更大的结构中 领域。 对于复杂结构,字段本身可以是packet
s。
您不需要只从二进制数据生成字段;因为
packetfield.\uu init\u
接受后解析值,也可以
从头开始构造packetfield
将得到的二进制形式转录出来。
每个packetfield子类都有以下方法:
转录
:轻松返回此字段的二进制转录, 或者直接作为一个块(或者为了方便,也没有或者 ascii str)或通过产生连续的二进制数据。from_buffer
:从cs.buffer.cornucopybuffer
from_bytes
:从具有 可选的起始偏移量;这是来自缓冲区
听起来有点神秘,但我们也提供:
扁平化
:从任意转录
方法并生成块,因此将数据包复制到 文件或其他地方总是可以通过遍历扁平化(field.transcribe())
或通过便利field.transcribe_flat()
方法,它调用flatten
本身。- 对于解析任何
几乎可以来自任何来源的数据块。
它有许多便利的工厂,包括:
从字节
,从块中生成缓冲区;从文件描述符生成缓冲区;
从文件
,从类似文件的对象生成缓冲区;在mmap中,使用 文件的内存映射(mmap
可以使用文件本身作为备份存储,而不是分配 复制记忆。 请参见
cs.buffer
模块了解更多详细信息。
分析复杂结构时
必须在子类化packetfield
或packet
之间进行选择。
有效的指标是子结构的程度。
a包
设计用于较深结构;
它的所有属性都是他们自己packetfield
s
(或数据包
,它们是数据包字段
子类)。
这个层次结构的左边将是packetfields
,
其属性为普通类型。
相比之下,packetfield的属性是"平面"值:
简单的后解析值,如astr
或aint
或者其他一些传统的python类型。
packetfield的基本情况
是一个这样的值,名为
。value
,
以及自然实现
是提供一个.value\from_buffer
方法
它返回基本的单个值
以及相应的"转录值"方法。
返回或放弃其二进制形式
(直接或分别成片)。
\uu init\ux
:从后解析值组成实例 (因此从零开始而不是从现有的二进制数据中解析)from_buffer
:分析值的类方法 从aCornucopyBuffer
调用类构造函数转录
:返回或产生属性的二进制形式
卡梅隆·辛普森cs@cskk.id.au2018年7月22日
类bsdata
mro:包装字段
,abc.abc
一个运行长度编码的数据块,其长度编码为bsuint。
类bssfloat
mro:包装字段
,abc.abc
转录为str(float)的bsstring的浮点。
类bsstring
mro:包装字段
,abc.abc
一个运行长度编码的字符串,其长度编码为bsuint。
类bsuint
mro:包装字段
,abc.abc
二进制序列的无符号整数。
这使用一个大端字节编码,其中连续八位字节 把它们的高位设置好。产生该值的位 是低阶的7位。
类bytesesfield
mro:包装字段
,abc.abc
包含字节块列表的字段。
定义了以下属性:
值
:作为字节实例列表收集的数据, 如果字段是用discard\u data
true收集的,则为None。偏移量
:数据的起始偏移量。结束偏移量
:数据的结束偏移量。
偏移量
和结束偏移量
值在
解析,如果字段的内容是
改变了
类bytesfield
mro:包装字段
,abc.abc
字节字段。
类bytesrunfield
mro:包装字段
,abc.abc
包含单个字节值连续运行的字段。
定义了以下属性:
长度
:运行的长度字节值
:重复的字节值
属性值
是在每次引用时动态计算的
并返回遵循缓冲区协议的值:字节或
MemoryView对象。
类emptypacketfield
mro:包装字段
,abc.abc
空数据字段,用作可选的占位符
字段不存在时。
singletonemptyfield
是一个预定义的实例。
函数固定字节字段(长度,类名=无)
由固定长度字节字符串生成的bytesfield子类的工厂。
函数展平(块)
将块
扁平化为一个可数个字节
实例。
它允许子类方法轻松返回ascii
字符串、字节或iterables,甚至none
,依次允许
它们只是返回超类的块迭代器
直接打开而不必打开。
类float64be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;d'
类float64le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;d'
类int16be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;h'
类int16le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;h'
类int32be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;l'
类int32le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;l'
类listfield
mro:包装字段
,abc.abc
一个字段,它是其他字段的列表。
函数多结构字段(结构格式,子值名称=无,类名称=无)
packetfield子类的工厂围绕复杂的结构格式构建。
参数:
结构格式
:结构格式字符串子值名称
:可选的名称双字段名称列表; 如果提供,则字段值将是 这些名称类名
:生成类的选项名
类数据包
mro:包装字段
,abc.abc
从二进制数据派生的复合对象的基类。
类packetfield
mro:abc.abc
单个数据包字段的记录。
函数结构字段(结构格式,类名)
packetfield子类的工厂是围绕单个结构格式构建的。
参数:
结构格式
:结构格式字符串,指定 单个结构字段类名
:生成的类的类名
示例:
>>> UInt16BE = struct_field('>H', class_name='UInt16BE')
>>> UInt16BE.__name__
'UInt16BE'
>>> UInt16BE.format
'>H'
>>> UInt16BE.struct #doctest: +ELLIPSIS
<Struct object at ...>
>>> field, offset = UInt16BE.from_bytes(bytes((2,3,4)))
>>> field
UInt16BE(515)
>>> offset
2
>>> field.value
515
函数结构元组(类名、结构格式、子值名)
多结构字段的方便包装。
类uint16be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;h'
类uint16le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;h'
类uint32be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;l'
类uint32le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;l'
类uint64be
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'>;q'
类uint64le
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'<;q'
类uint8
mro:包装字段
,abc.abc
一个packetfield,它解析并转录结构格式'b'
类utf8nulfield
mro:包装字段
,abc.abc
以NUL结尾的UTF-8字符串。