Binary Data Services 二进制数据服务

本文介绍了Python中struct模块和codecs模块在处理二进制数据时的作用。struct模块用于将Python值转换为C结构体(bytes)和反之,而codecs模块提供了编码和解码功能,包括自定义codec的实现步骤。文章详细讲解了struct的格式字符串、Byte Order, Size, and Alignment以及codecs的编码解码基类和错误处理。此外,还给出了自定义codec的示例代码。" 76228213,6858734,Kafka 消费与生产测试,"['消息队列', 'Kafka', 'Java开发', '分布式']
摘要由CSDN通过智能技术生成

本章节主要提供了一些基本的二进制数据的操作,其他操作尤其和文件格式和网络协议的在相应章节。
另外请参考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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值