处理二进制压缩数据的单个文件、纯python包

rawutil的Python项目详细描述


rawutil
==
一个处理二进制压缩数据的单文件纯python模块


结构
-对于打字机和打字机对象

<1-string结构
----
rawutil可以像struct一样使用,结构存储为string。rawutil几乎与struct完全兼容。如果在程序中,可以用"rawutil"替换"struct"的所有实例,则其工作方式应完全相同(有关问题,请参见下文)。



pack(stct,*data)->;bytes
将元素打包到一个bytes对象中,如structure sp所述由stct参数指定stct参数中的结构,并以列表形式返回元素
数据也可以是类似文件的对象。在这种情况下,解包将从文件的开头开始(它执行file.seek(0))
refdata选项是一个元组,它包含外部引用使用的数据,请参见下文。
请注意,与它的等效结构不同,如果数据长度不是匹配结构长度。

unpack_from(stct,data,offset=0,refdata=,getptr=false)
根据stct参数的说明从指定的偏移量解压缩数据,并返回元素作为列表
数据也可以是类似文件的对象。在这种情况下,解包将从指定位置开始(执行file.seek(offset))
refdata参数用于外部引用,请参见下面的
如果getptr为true,则此函数返回*unpacted,ptr*而不是仅返回*unpacted*。指针是解包结束时的偏移量



rawutil结构可以匹配可变长度,因此不存在任何*calcsize*函数。


string结构引用
----
结构是str对象。

要指定字节顺序,请与*struct*:

+——+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+-————+
@使用系统字节顺序,不对齐
+——+——+———————————————————————————————————————————————————————————————|网络字节顺序(与>;)
+——+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————+——————————————————————————————————————————————————————————————————————————————————————————————注意,与*struct*的结构不同,rawutil结构可以包含任意多的空间。

|键入description
+=+=+=+==+=+=+==+====+=======+=========+==================+
c char返回一个1字节字节对象----+
b int8有符号8位(1字节)整数
+——+—————————————————————————————————————————————————————-----------------+
b uint8无符号8位整数
+-------+------------+---------------------------+
?| bool从字节返回布尔值(如果为0,则为false,否则为true)
+——+——+———————————————————————————————————————————————————————————————————————————————————————————————----+
h uint16无符号16位整数
+——+——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————---————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+---——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-+——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————ytes bytes对象,与"12c"不同,后者返回12个1字节的对象。还请注意,p和n不可用,n也不用作类似于*struct*


中的ssize,rawutil中还引入了新的格式字符:

+——+——+————————————————————————————————————————————————————————————————————|类型说明
+=+=+=+==+=+=+=+===+=====+========+======================+
u int24有符号24位(3字节)整数--——————————————————————————————————————————————————————————————————————————————————————-----------------------------------+
a pad alignment:对齐到指定数字的倍数
+-------+--------------------------------+
x hex与s类似,但返回的字节是十六进制string
+——+——+——————————+—————————————————————————————————————————————————————————————————————————————————————————————————————————发射型计算机断层扫描仪。从当前指针位置读取字符串,直到找到空字节(0x00)。返回的字符串中不包含空字节。在包装上,它包装了对象,并在末尾添加一个空字节。它应该像"20A"一样使用:数字表示对齐。解包时,它将指针放在对齐的下一个倍数处。它什么也不回。打包时,它将添加空字节,直到达到对齐长度的倍数(在数据参数中跳过它)

"$"元素表示结束。解包时,它将所有剩余的未读数据作为bytes对象返回,并结束读取(它将指针放在数据的末尾)。在打包时,它将相应的bytes对象附加到打包字节末尾的数据参数中,并结束打包。

imes

()元素表示一个组。其使用方式应为:

"4si2h(2b 2h)20a"


支架之间的所有元件将作为子结构在列表中展开。这里,它可以返回例如:

[b'test',10000,326,1919,[11,19,112,1222],b'\x00\x00']

应该这样使用:

"h 4[2b]"

它将读取子结构的次数与[。它将返回一个列表列表,如下所示:

[-1234,[[11,12],[111,112],[9,99],[31,112]]]

与[]一样,它返回一个列表列表。例如,这个结构:

<4s{bn}


引用类型:外部和内部引用。

外部引用用""表示。它们将替换为refdata参数中的相应元素。例如,使用此调用::

data=b'<;some bytes>;!"
rawutil.unpack(''0c 1s 2c',data,refdata=(1,len(data)-3,2))




"0"替换为1,"1"替换为(len(data)-3),这里10,"2"替换为2:最终结构为"1C10S 2C",因此它将返回:

[b'<;',b'一些字节',b'>;',b'!'b'!'b''b''b'>
[b'<;'b'<;''b'一些字节',b''b'>;''是的]

然后,内部引用。它们用"/"表示,应该这样使用:

'4s2b/2[2s]'


"/"附近的数字是引用的索引。引用将被指定索引处的未打包元素替换,这里是第二个"b",因此使用此数据:



[b'test',255,6,[[b'zy'],[b'xw'],[b'vu'],[b'ts'],[b'rq'],[b'po']]]

拆包的元素包含6,因此"/2"替换为"6",因此它被解释为"4s2b6[2s]",因此[2s]按元素2指定的次数被拆包。


内部引用也可以是相对的,用"/p"。例如,可以使用此结构:

'2b/p2[2s]


例如,4

objects
==


>还可以将rawutil与objects typereader和typewriter一起使用。


typereader(byteorder='@')
typewriter(byteorder='@')

byteorder参数是使用的byteorder标记,与格式字符串"one"完全相同。您还可以使用这些对象的byteorder属性指定它。

pack、unpack和unpack_from方法与模块级的方法完全相同,但如果字节顺序在结构中没有精确化,则默认为byte order属性而不是"@"。

它有以下方法:

bit(n,bit,length=1)
返回n整数中指定的位。返回(长度)位
nibbles(n)
返回一个字节的高位和低位nibbles
signed_nibbles(n)
返回一个字节的高位和低位signed nibbles

其所有其他方法都采用2个参数:

typereader.uint8(data,ptr=0)

ptr是开始读取的偏移量。如果没有,则从当前文件位置开始读取(由file.tell()给定),如果数据是类似字节的对象,则从0开始读取。它的所有其他方法返回(unpacted,ptr),其中unpacted是unpacted元素,ptr是读取结束的偏移量。


typereader对象有以下方法:

uint16(data,ptr=none)
uint24(data,ptr=none)
uint32(data,ptr=none)
uint64(data,ptr=none)
int8(data,ptr=none)
int16(data,ptr=none)
int24(data,ptr=none)
int32(data,ptr=none)
int64(data,ptr=none)
float32(data,ptr=none)=float(…)
double(data,ptr=none)
64位double
string(data,ptr=none)
int8(data,ptr=none)
int8(data,ptr=none)
int16(data,ptr=none)
int24(data,ptr=non字符串(数据,ptr=无)#以空结尾的utf-16字符串

然后,打字机对象可以打包一些元素。它有以下方法:(data参数是要打包的元素,out可以是输出文件一样的对象)::

signed nibbles(high,low)idem和signed nibbles
int8(data,out=none)
int16(data,out=none)
int24(data,out=none)
int32(data,
int64(data,out=out=none)
uint8(data,out=out=none)
uint16(data,out=none)
uint24(data,out=none)
uint32(data,out=none)
uint32(data,out=none)
uint64(data,out=none)
uint64(data,out=none)
int64(data,out=none)
int64(data,out=none)
int64(data,out=none=none)
uint8(data,out=none)
uint16(data,out=none)
打包。将bytes对象打包为以空结尾的字符串
utf16string(data,align=0,out=none)
pad(num)返回给定的空字节数
align(data,alignment)返回空字节以填充到对齐的倍数

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么用Jsoup解析后内容不一样   java save方法无法使用Hibernate+Spring保存对象   java如何从JaxWs WebMethod发送Http状态为202的空响应   Java BuffereImage“块”模糊问题   java中的模板CAL集   java MyBatis deleteinsertupdate在一个查询中   在执行下一个方法之前,java将等待线程执行结束   java JTextField无法保存enter字符   java回滚撤消重做   java解析异常的最佳实践。toString()来执行一些逻辑   在Java中完成类的精确副本的构造函数的单元测试   java我无法从LinkedList类调用客户端中的方法   java启动RxJava2可观察。没有初始延迟的间隔()?   添加更多参数时java Mybatis插入失败