本章节主要提供了一些基本的二进制数据的操作,其他操作尤其和文件格式和网络协议的在相应章节。
另外请参考python内置类型binary sequence types(bytes,bytearray,memoryview)
主要介绍struck和codecs模块
struct,处理bytes数据(c)和python值(浮点值,bytes,整型)的转换。fmt参数有两个部分Byte Order, Size, and Alignment(这个部分尽量赋值,不然默认@,感觉比较麻烦)和format chatachor。
codcs,编码解码(code和decode)。简单介绍一下,编制一个自定义的codec的步骤:大家这里可以参考一下cp1252.py这个在lib\encoding下的文件。
1,继承codecs中Codec、IncrementalEncoder、IncrementalDecoder、StreamWriter和StreamReader,根据需要重写encode和decode函数。
2,建立一个可以返回CodecInfo对象的对象(如函数getregentry就可以)属性除了这种编码的name,其他值对应上面定义的类如下
def getregentry():
return codecs.CodecInfo(
name='selfdeifine',
encode=Codec().encode,
decode=Codec().decode,
incrementalencoder=IncrementalEncoder,
incrementaldecoder=IncrementalDecoder,
streamreader=StreamReader,
streamwriter=StreamWriter,
)
3、注册这个codec,用codecs.register(getregentry)
4,这样如果重写了Codec的encode方法,你就可以用str.encode(‘selfdefine’),进行自定义的编码了
注意:你们会发现在cp1252中没有第三步,不光如此,encoding下的这种编码文件都没有哦。统一到了__init_ _.py里, 这个py文件会标准化格式,检查修正codec的接口等,还会处理其他名(如utf-8是utf_8的其他名),最后注册encoding中的codec。
这里仅仅简单介绍下主体工作流程,便于后面介绍不容易跑偏。本文的例子重点集中于重写Codec类的encode和decode方法。
struct Interpret bytes as packed binary data
==这个module的作用在于实现python数据和cstruck(以python bytes对象呈现)的转换,本module常用来处理网络连接和文件的二进制数据,==他用 formatstring,作为对cstruct的简介描述,用以python vlaue和cstruct(bytes 对象)的转化。
注意:默认pack或是unpack一个cstruck为了保持正确的队列包含了空白字节,这种方式使得一个packed struck的字节和内存里的c struck布局一样;处理独立平台的的数据格式或者社区空白字节,使用standard size和alignment,而不是native的。下面的see Byte Order, Size, and Alignment for details.、
有几个函数(struct的方法)以buffer为参数(指的是执行buffer protocol且提供刻可读或者可读写的buffer)。参数大多数是bytes和bytearray,还有许多其他类型看做array来执行buffer protocal,所以他们可以被读不需要从bytes对象复制。
Functions and Exceptions
exception struct.erro
struct.pack(fmt, v1, v2, …):
返回一个bytes对象包含值v1,v2…按照fmt来打包。参数必须符合format的要求。、
struct.pack_into(fmt, buffer, offset, v1, v2, …)
按照fmt规则打包这些数值,把打包的bytes对象从buffer的offset写入。
struct.unpack(fmt, buffer)
根据fmt解包,结果为一个tuple,即使只包含一个元素。buffer的大小必须满足format的要求(calcsize的计算值)
struct.unpack_from(fmt, buffer, offset=0)
从buffer的offset出读数据并解包
struct.iter_unpack(fmt, buffer)
struct.calcsize(fmt)
Format Strings
foramt用来指出当打包解包数据的布局,主要由以下两个部分。
查看format的第一个字符,如果出现Byte Order, Size, and Alignment的字符,则剩下的为format character的字符;如果没有默认为@
Byte Order, Size, and Alignment
默认的,c types以机器本地的format,bytesorder,和对齐方式(根据c compler的规则)呈现。
可选的,第一个format字符可以时指出bytes order,size和alignment,根据下表。
如果第一个字符没有上面提到的字符,则默认@。
注意除了@都没有alignment
Native order可能是大或小开头,决定于主机系统;可以用sys.bytesorder去检查。
native size和alignment被c的complier的sizeof表达式决定。
标准大小(standard size)由下一节的format character决定。
The form ‘!’ is available for those poor souls who claim they can’t remember whether network byte order is big-endian or little-endian.
There is no way to indicate non-native byte order (force byte-swapping); use the appropriate choice of ‘<’ or ‘>’.
注意:
padding(添加的空白)只会在前后structure成员间添加,encoded的struct的首尾不会添加padding
当用non-native size 和alignment,‘<’, ‘>’, ‘=’, 和 ‘!’,padding不会添加。
pack('>llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03'
pack('llh0l', 1, 2, 3)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
注意一定是0l,否则会报错
To align the end of a structure to the alignment requirement of a particular type, end the format with the code for that type with a repeat count of zero. See Examples.
Format character
本节要注意有些格式字符的在有些情况被支持。
因为是struct是在c和python类型的转换,下面定义了对照表。上文的标准大小(standard size)由本节的format character决定。
Notes:
?对应_Bool类型,如果这个类型不可用,他被认为是char。在标准模式,他都是一个字节
q和Q在native模式里只有在平台c的compiler支持c的long long或者在windows