python中的结构解析变得简单。
dissect.cstruct的Python项目详细描述
#python中的dissect.csstruct
结构解析变得简单。使用csstruct,您可以编写类似于c的结构,并使用它们来解析二进制数据,可以将其作为类似于文件的对象或bytestrings。
csstruct解析二进制数据感觉既熟悉又简单。在开始分析数据之前,无需学习新语法或新解析库的特性。语法不是严格的c,但它与大多数常见的结构定义兼容。您可以经常使用开放源码c项目中的结构定义,并在不做任何更改的情况下直接使用它们。需要解析ext4超级块吗?只需从linux内核源代码中复制结构定义。需要分析一些自定义文件格式吗?编写一个简单的结构,然后立即开始分析数据,并在运行时调整结构。
by design cstruct非常简单。没有复杂的语法,过滤器,前或后处理步骤。只需进行结构解析。
之后,您就可以从您的python代码开始使用它们了。
`` python
定义一些常数5
>枚举示例:uint16{
>a,b=0x5,c
};
>构造一些结构{
>uint8域的一个字段;
>char field~u 2[so一些常数];
>char field~u 3[field~1&;1*5];///一些随机表达式来计算数组长度
示例字段>;
<<
<<
<
<<
<
<
<
=B'\x01希腊语x00\x00\x00\x06\x00'
result=cparser.someu struct(data)也接受类似文件的对象
assert result.field\u 1==0x01
assert result.field\u 2==b'hello'
assert result.field\u 3==b'world'
assert result.field\u 4=[cparser.example.a,cparser.example.c]
assert cparser.assert.example.a==0
assert cparser.a==assert cparser.a,cparser.a,cparser示例.c==6
assert cparser.example(5)==cparser.example.b
ance.dumps()==B'\x05loremipsum\x05\x00\x00\x00'
````
>默认情况下,所有结构都编译为提供优化性能的类。可以通过向`.load()`调用传递一个'compiled=false'关键字参数来禁用此功能。您还可以通过访问结构的源属性来检查生成的源代码:`print(cparser.some廑struct.source)`.
可以在"examples"目录中找到更多示例。
例如,下面这些都是支持的:
``python
>from dissect import csstruct
>cs=csstruct.csstruct.csstruct
默认endiannesis le,但可以使用kwarg或设置属性(如csstruct.csstruct.csstruct(endian='>;')或设置属性(如csstruct.csstruct.csstruct(endian='>;'))或cs.endian='>;'
assert cs.uint32断言cs.uint32(b'\x05\x05\x05\x00\x00\x00\x00\x00\x00\x00'=.uint24[2]单元](b'\x01\x00\x00\x02\x00\x00')==[1,2]您还可以使用列表索引分析数组
assert cs.char[none](b'hello world!\ x00')==b"你好,世界!"#无表示以空结尾的列表索引
```
它们与边界正确对齐。
`` python
bitde
结构测试{
uint16 a:1;
uint16 b:1;从uint16中读取2位;下一个字段正确对齐
uint16 d:2;下一个字段正确对齐
uint16 d:2;
uint16 e:3;
};
>"
bitfields=c struct.cstruct()
bitfields.load(bitdef)bitfields.load(bitdef)
d=b'\x03\x00\xff;从uint16中读取2位;下一个字段正确对齐
uint16 d:3;
;
a=位字段。测试(d)
assert a.a==0b1
assert a.b==0b1
assert a.c==0xff
assert a.d==0b11
assert a.e==0b111
assert a.dumps()==d
````
从功能上讲,它最好与intenum类型相比较。
编写自己的语法分析器!
todo
-嵌套结构定义
-联合
结构解析变得简单。使用csstruct,您可以编写类似于c的结构,并使用它们来解析二进制数据,可以将其作为类似于文件的对象或bytestrings。
csstruct解析二进制数据感觉既熟悉又简单。在开始分析数据之前,无需学习新语法或新解析库的特性。语法不是严格的c,但它与大多数常见的结构定义兼容。您可以经常使用开放源码c项目中的结构定义,并在不做任何更改的情况下直接使用它们。需要解析ext4超级块吗?只需从linux内核源代码中复制结构定义。需要分析一些自定义文件格式吗?编写一个简单的结构,然后立即开始分析数据,并在运行时调整结构。
by design cstruct非常简单。没有复杂的语法,过滤器,前或后处理步骤。只需进行结构解析。
之后,您就可以从您的python代码开始使用它们了。
`` python
定义一些常数5
>枚举示例:uint16{
>a,b=0x5,c
};
>构造一些结构{
>uint8域的一个字段;
>char field~u 2[so一些常数];
>char field~u 3[field~1&;1*5];///一些随机表达式来计算数组长度
示例字段>;
<<
<<
<
<<
<
<
<
=B'\x01希腊语x00\x00\x00\x06\x00'
result=cparser.someu struct(data)也接受类似文件的对象
assert result.field\u 1==0x01
assert result.field\u 2==b'hello'
assert result.field\u 3==b'world'
assert result.field\u 4=[cparser.example.a,cparser.example.c]
assert cparser.assert.example.a==0
assert cparser.a==assert cparser.a,cparser.a,cparser示例.c==6
assert cparser.example(5)==cparser.example.b
ance.dumps()==B'\x05loremipsum\x05\x00\x00\x00'
````
>默认情况下,所有结构都编译为提供优化性能的类。可以通过向`.load()`调用传递一个'compiled=false'关键字参数来禁用此功能。您还可以通过访问结构的源属性来检查生成的源代码:`print(cparser.some廑struct.source)`.
可以在"examples"目录中找到更多示例。
例如,下面这些都是支持的:
``python
>from dissect import csstruct
>cs=csstruct.csstruct.csstruct
默认endiannesis le,但可以使用kwarg或设置属性(如csstruct.csstruct.csstruct(endian='>;')或设置属性(如csstruct.csstruct.csstruct(endian='>;'))或cs.endian='>;'
assert cs.uint32断言cs.uint32(b'\x05\x05\x05\x00\x00\x00\x00\x00\x00\x00'=.uint24[2]单元](b'\x01\x00\x00\x02\x00\x00')==[1,2]您还可以使用列表索引分析数组
assert cs.char[none](b'hello world!\ x00')==b"你好,世界!"#无表示以空结尾的列表索引
```
它们与边界正确对齐。
`` python
bitde
结构测试{
uint16 a:1;
uint16 b:1;从uint16中读取2位;下一个字段正确对齐
uint16 d:2;下一个字段正确对齐
uint16 d:2;
uint16 e:3;
};
>"
bitfields=c struct.cstruct()
bitfields.load(bitdef)bitfields.load(bitdef)
d=b'\x03\x00\xff;从uint16中读取2位;下一个字段正确对齐
uint16 d:3;
;
a=位字段。测试(d)
assert a.a==0b1
assert a.b==0b1
assert a.c==0xff
assert a.d==0b11
assert a.e==0b111
assert a.dumps()==d
````
从功能上讲,它最好与intenum类型相比较。
编写自己的语法分析器!
todo
-嵌套结构定义
-联合