加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

4. 二进制数据处理库

发布时间:2020-12-14 02:15:04 所属栏目:大数据 来源:网络整理
导读:二进制处理库主要是针对二进制数据的操作和使用,也有介绍一些特定的操作,比如像文件格式和网络协议。 在前面也介绍了文本处理库,其实有一部分功能也是能处理二进制数据的,比如正则表达式 re ,或者是 difflib 比较库对数据进行处理。此外,在 python 内

二进制处理库主要是针对二进制数据的操作和使用,也有介绍一些特定的操作,比如像文件格式和网络协议。

在前面也介绍了文本处理库,其实有一部分功能也是能处理二进制数据的,比如正则表达式re,或者是difflib比较库对数据进行处理。此外,在python内部也提供了bytes/bytearray/memoryview等数据类型进行操作。

4.1?struct--二进制数据打包和解包

本模块主要对python的数值与C结构表示为pythonbytes对象之间进行转换。通过此模块可以处理以二进制保存在文件里的数据,也可以处理网络连接之间相互传送的数据,或者其它来源的二进制数据。此模拟主要通过格式化字符串方式来描述C结构的保存格式,然后根据这个格式来读取或保存python内部表示的数据类型。

在模块struct里,很多函数都需要使用一个缓冲区参数,因而此缓冲区参数应实现buffer协议,并且提供读或者读写的功能。大多数情况下使用bytesbytearray都可以满足要求,不过其它类型也有实现buffer协议,基本上都是可以查看的功能。

4.1.1?函数和异常

本模块定义下面异常和函数功能:

exception?struct.error

定义struct操作出错异常原因,struct.error是返回一个字符串描述出错原因。

例子:

#python?3.4.3

import?struct

?

b?=?0

?

try:

????print('测试')

????struct.pack('a',?b)

except?struct.error?as?error:

????print('异常出错提示:',?error)

结果输出如下:

测试

异常出错提示:?bad?char?in?struct?format

?

struct.pack(fmt,?v1,?v2,?...)?

把参数v1v2按格式fmt格式化填充到缓冲区,返回一个bytes对象。参数的个数和类型要与格式化字符串一致。

例子:

#python?3.4.3

import?struct

?

print(struct.pack('hhl',?1,?2,?3))

结果输出如下:

b'x01x00x02x00x03x00x00x00'

?

struct.pack_into(fmt,?buffer,?offset,?...)?

把参数v1v2按格式fmt打包,并写入缓冲区对象buffer的开始位置offset处。注意位置参数offset一定要提供。

例子:

#python?3.4.3

import?struct

?

buf?=?bytearray(10)

print(struct.pack_into('hhl',?buf,?0,?3))

print(buf)

结果输出如下:

None

bytearray(b'x01x00x02x00x03x00x00x00x00x00')

?

struct.unpack(fmt,?buffer)?

从一个缓冲区bytes对象buffer按格式化字符串进行解包,把解包出来的相应字段生成一个元组返回。缓冲区的大小应满足len(bytes)等于calcsize(fmt)大小。否则会抛出异常错误。

例子:

#python?3.4.3

import?struct

?

buf?=?struct.pack('hhl',?3)

print(buf)

?

print(struct.unpack('hhl',?buf))

结果输出如下:

b'x01x00x02x00x03x00x00x00'

(1,?3)

?

struct.unpack_from(fmt,?offset=0)?

从缓冲区buffer的指定位置offset,按格式fmt进行解包,把结果放到元组里。要求buffer[offset:]的大小至少大于calcsize(fmt)的大小。

例子:

#python?3.4.3

import?struct

?

buf?=?bytearray(10)

struct.pack_into('hhl',?3)

print(buf)

?

tmp?=?struct.unpack_from('hhl',?0)

print(tmp)

结果输出如下:

bytearray(b'x01x00x02x00x03x00x00x00x00x00')

(1,?3)

?

struct.iter_unpack(fmt,?buffer)

迭代地按格式fmt来解包缓冲区buffer,要求buffer的长度刚好是格式fmt的整数倍大小,否则抛出异常。与unpack()多次调用比较主要是提高解包的速度。

例子:

#python?3.4.3

import?struct

?

buf?=?bytearray(20)

struct.pack_into('hhl',?3)

struct.pack_into('hhl',?8,?4,?5,?6)

print(buf)

?

btBuf?=?bytes(buf[0:16])

for?tmp?in?struct.iter_unpack('hhl',?btBuf):

????print(tmp)

结果输出如下:

bytearray(b'x01x00x02x00x03x00x00x00x04x00x05x00x06x00x00x00x00x00x00x00')

(1,?3)

(4,?6)

?

struct.calcsize(fmt)?

计算给出格式字符串fmt来计算需要缓冲区的大小。

例子:

#python?3.4.3

import?struct

?

print('hhl:',?struct.calcsize('hhl'))

print('hhh:',?struct.calcsize('hhh'))

结果输出如下:

hhl:?8

hhh:?6


蔡军生 QQ:9073204 深圳

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读